首页 > 代码库 > android内部通信handler

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 = http://www.mamicode.com/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 停止消息


android内部通信handler