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 停止消息


原文地址:https://www.cnblogs.com/alwaysfirst/p/4006838.html