android内部通信handler

什么是handler?

handler主要用在用户同自己创建的线程进行通信,andorid应用程序在主线程中会维护一个消息队列,通过Message对象在线程间进行通信.在handler内部的handlerMessage中处理消息请求

其实学习过VC++的朋友应该可以很好的理解handler,类似于VC++中的消息处理

Message对象都都存储了什么?

一共有4个参数,arg1,arg2,obj,what

arg1和arg2 是int类型,可以通过成员方法setData和getData访问进行修改

obj ,object类型,可以存储任意类型,比如放一个对象,一个int值,也就是消息中的附加数据

what,int类型,就是用户定义的消息类型码,可以通过what判断是什么消息

我们来做个例子,这个例子有一个TextView显示进度和完成及停止的内容,一个ProgressBar来显示进度,两个Button,用于开始和停止

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.ssln.handler.MainActivity" >

    <TextView
        android:id="@+id/tvMsg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

    <ProgressBar
        android:id="@+id/progbar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/btnstart"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="开始" />

        <Button
            android:id="@+id/btnstop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="停止" />

    </LinearLayout>

</LinearLayout>

MainActivity.java

package com.ssln.handler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity {

    private final int UPDATEMSG = 1; // 更新消息类型
    private final int COMPLETEMSG=2; // 完成消息
    private final int STOPMSG=3;     // 停止消息
    private final int MAXVALUE = 100; // ProgressBar最大值

    private boolean isStop=false;     //是否停止

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final TextView tvMsg = (TextView) findViewById(R.id.tvMsg);
        final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progbar);
        Button btnstart = (Button) findViewById(R.id.btnstart);
        Button btnstop=(Button)findViewById(R.id.btnstop);

        // 设置最大值
        progressBar.setMax(MAXVALUE);

        // 初始化一个handler,用于更新textview和progressBar
        final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                 switch(msg.what)
                 {
                 case UPDATEMSG:
                    tvMsg.setText(msg.obj.toString() + "%");
                    progressBar
                            .setProgress(Integer.valueOf(msg.obj.toString()));
                    break;
                 case COMPLETEMSG:
                     tvMsg.setText("完成了更新操作");
                     break;
                 case STOPMSG:
                     tvMsg.setText("停止了更新操作");
                     break;
                 }

            }
        };

        //停止操作
        btnstop.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                 isStop=true;
            }
        });

        //开始 使用BUTTON来创建一个新线程,来更新数据
        btnstart.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread() {
                    public void run() {
                        Message msg;
                        for (int i = 0; i < MAXVALUE; i++) {
                            if(isStop)
                            {
                                break;
                            }
                            // 循环发送消息,实现内部通信
                            msg = new Message();
                            msg.what = UPDATEMSG;
                            msg.obj = i + 1;
                            handler.sendMessage(msg);
                            try {
                                // 睡眠一段时间
                                Thread.sleep(150);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        if(!isStop)
                        {
                            //发送完成消息
                            msg = new Message();
                            msg.what =COMPLETEMSG ;
                            handler.sendMessage(msg);
                        }
                        else
                        {
                            //发送停止消息
                            msg = new Message();
                            msg.what =STOPMSG ;
                            handler.sendMessage(msg);
                            isStop=false;
                        }

                    }

                }.start();
            }
        });
    }

}

当点击开始按钮后,每间隔150毫秒,会发送一个updatemsg,其中的obj为当前的进度值,进度条设置进度为obj,textview会显示百分比



当进度到达100%的时候,会发送一个COMPLETEMSG 完成消息,用于TextView更新显示



如果在更新过程中,点击了停止,那开始的线程中就会跳出循环,并发送一个 STOPMSG 停止消息

时间: 2024-10-13 12:43:32

android内部通信handler的相关文章

Android的Handler深入解析

1.概述 前面写过一篇文章<Android中的消息机制>简单分析了异步消息机制,本文将深入解读Handler的原理. 2.基本概念 单线程模型中的Message.Handler.Message Queue.Looper之间的关系: Handler获取当前线程的Looper对象,Looper用来从存放Message的MessageQueue中取出Message,再由Handler进行Message的分发和处理. (1)Message Queue(消息队列) 用来存放通过Handler发布的消息,

android之handler机制深入解析

一.android中需要另开线程处理耗时.网络的任务,但是有必须要在UI线程中修改组件.这样做是为了: ①只能在UI线程中修改组件,避免了多线程造成组件显示混乱 ②不使用加锁策略是为了提高性能,因为android中经常使用多线程. handler就是为了解决在多个线程之间的通信问题. 二.基本使用: 1 package com.dqxst.first.multithread; 2 3 import android.app.Activity; 4 import android.os.Bundle;

Android Thread Handler UIHandler demos

extends:http://blog.csdn.net/superjunjin/article/details/7540064 序效果:为了显示如何用message传值的简单例子 例1,点击按钮,持续显示当前系统时间(bundle传值,耗时,效率低) 例2,点击按钮,progressbar持续前进(message方法传值,效率高,但只能传整型int和对象object) 例1,主activity  package com.song; import java.text.SimpleDateForm

Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)

keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主要研究Handler的消息发送. 包含主线程往子线程发送消息,子线程之间互相发送消息. 一.主线程向子线程发送消息. 实现过程比較简单: 主线程发送消息到异步线程.异步线程接收到消息后在再发送一条消息给主线程. 1. 初始化主线程的Handler,用来接收子线程的消息. 2. 启动异步线程.在异步线

深入解析Android中Handler消息机制

Android提供了Handler 和 Looper 来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(MessageExchange).Handler消息机制可以说是Android系统中最重要部分之一,所以,本篇博客我们就来深入解析Android中Handler消息机制. Handler的简单使用 为什么系统不允许子线程更新UI 因为的UI控件不是线程安全的. 如果在多线程中并发访问可能会导致UI控件处于不可预期的状态,那为什么不对UI控件的访

Android 测试Handler的基本使用

package com.sherlock.app_handler; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import andro

Android之Handler用法总结

方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread( new Runnable() { public void run() { myView.invalidate(); } }).start(); 可以实现功能,刷新UI界面.但是这样是不行的,因为它违背了单线程模型:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行. 方法二

Android - This Handler class should be static or leaks might occur.

今天学习了使用 HTTP协议,从Android客户端往Tomcat服务器端以GET发送请求,途中无意中发现自己写的Handler类被Android提示:This Handler class should be static or leaks might occur. 往google上type,发现很多网友都做了解释,也感触颇深,编译器的提示,有时真的要留意,这对自己学习也有很大的帮助. 虽然多了几行代码,但为了实用,我就上贴自己实际点的例子,Activity: package spt.http.

Android的Handler及looper

看了这么多的文章,终于看懂了. 参考文献: [1]android developer handler [2]Android中Handler作用 [3] Android Thread Looper Handler 关系 [4]android的消息处理机制(图+源码分析)--Looper,Handler,Message 1.从定义上理解Handler 首先有一下参考文献[1]中的一句英文句子来说明下: A Handler allows you to send and process Message