Android Handler机制的简单理解

版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎访问http://github.com/shenhuanet 转载请注明出处: https://blog.csdn.net/klxh2009/article/details/78800201

Android Handler 机制的简单理解


简述

创建一个 Message 对象,然后借助 Handler 发送出去,之后在 Handler 的 handleMessage() 方法中获取刚才发送的 Message 对象。

在子线程更新 UI

  • Handler
  • Activity.runOnUiThread()
  • View.post(Runnable r)

Handler 主要由以下部分组成

Handler Handler 是一个消息辅助类,主要负责向消息池发送各种消息事件 Handler.sendMessage() 和处理相应的消息事件 Handler.handleMessage()。
Message Message 即消息,它能容纳任意数据,相当于一个信息载体。
MessageQueue MessageQueue 如其名,消息队列。它按时序将消息插入队列,最小的时间戳将被优先处理。
Looper Looper 负责从消息队列读取消息,然后分发给对应的 Handler 进行处理。它是一个死循环,不断地调用 MessageQueue.next() 去读取消息,在没有消息分发的时候会变成阻塞状态,在有消息可用时继续轮询。

Looper.prepare();
Handler mHandler = new Handler() {
   @Override
   public void handleMessage(Message msg) {
          Log.i(TAG, "在子线程中定义Handler,并接收到消息。。。");
   }
};
Looper.loop();
// 1. 创建 HandlerThread 并准备 Looper
handlerThread = new HandlerThread("myHandlerThread");
handlerThread.start();
// 2. 创建 Handler 并绑定 handlerThread 的 Looper
new Handler(handlerThread.getLooper()).post(new Runnable() {
    @Override 
    public void run() {
          // 注意:Handler 绑定了子线程的 Looper,这个方法也会运行在子线程,不可以更新 UI
          MLog.i("Handler in " + Thread.currentThread().getName());
    }
});
// 3. 退出
@Override public void onDestroy() {
    super.onDestroy();
    handlerThread.quit();
}
  • 使用 post 方法提交任务,postAtFrontOfQueue() 将任务加入到队列前端, postAtTime() 指定时间提交任务, postDelayed() 延后提交任务。
  • 使用 sendMessage() 方法可以发送消息,sendMessageAtFrontOfQueue() 将该消息放入消息队列前端,sendMessageAtTime() 指定时间发送消息, sendMessageDelayed() 延后提交消息。

HandlerThread 的 quit() 和 quitSafety() 区别

两个方法作用都是结束 Looper 的运行。它们的区别是:quit() 方法会直接移除 MessageQueue 中的所有消息,然后终止 MesseageQueue,而 quitSafety() 会将 MessageQueue 中已有的消息处理完成后(不再接收新消息)再终止 MessageQueue。

猜你喜欢

转载自blog.csdn.net/klxh2009/article/details/78800201
今日推荐