Android异步消息机制——Handler

Android的Handler机制是一种线程间通信机制,可以避免耗时操作在主线程中进行致使Activity超时而被关闭的问题。
刚开始看这个机制时,看到了很多Looper, MessageQueue, Handler等内容,讲到源码级别了,感觉真的高深莫测。

Handler机制的流程

看了很多blog后,我发现其实入门时不用看的那么复杂,只要知道Handler就好了,Handler可以翻译为处理者,就是处理消息的人的意思。他相当于A线程的秘书,当A有件事情需要委托给B做时,就叫秘书通知B,B做完后告诉秘书,他做完了,可以上报给A,让A再做后序的工作。

Handler机制的基本用法

秉着实用主义原则,还是先从Handler的使用角度来说总结一下Handler的用法吧。

创建一个Handler实例

private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        Log.d(TAG, "handleMessage: msg.what = " + msg.what + " msg.arg = " + msg.arg1);
        switch (msg.what) {
            case OVER:
                text.setText("下载完成");
                break;
            case PROGRESS:
                text.setText("已完成" + msg.arg1 + "%");
                break;
            default:
                break;
        }
    }
};

需要覆写handleMessage方法,该方法通是通过msg.what来判断消息类型,从而进入不同的业务处理逻辑中。

向子线程传入handler

class DownloadThread extends Thread {
   Handler handler;
   public DownloadThread(Handler handler) {
       this.handler = handler;
   }
}

在需要的时候从子线程中回传一个消息

实例中模拟一个下载动作,即向下载子线程中传入handler,定时用该handler构造一个message,回传给主线程更新TextView显示。

@Override
public void run() {
    while (progress < 100) {
        Message response = Message.obtain(handler);
        response.what = PROGRESS;
        progress += 5;
        if (progress == 100) {
            response.what = OVER;
        }
        response.arg1 = progress;
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        response.sendToTarget();
    }
}
  • what
    用来标记该消息类型,如PROGESS、OVER都是用来表示现在下载所处状态。
  • arg1
    是用来存储消息中的其他附加值,如实例中arg1用来存储下载进度。

结语

好了,这样一个简单的handler机制的demo就算完成了。Android的框架为我们将观察者机制完全搭好,我们需要做的是在主线程中构造好handler里的业务处理逻辑,并子线程中进行消息反馈即可。

完整代码

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐