Android 消息处理机制1(从源码分析)

Handler 作为Android 的常客,同时在安卓系统上占着重大地位,就拿Activity 的生命周期、事件分发来说都是由Handler 来处理消息,并分发消息。

1.Handler 是什么?
Android 消息处理机制 (发送消息 和 处理消息)以及 UI 更新机制 (main 线程 和子线程[不能更新 UI] 交互)

[ 官方文档介绍: ]

A Handler allows you to send and process Message and Runnable objects associated with a thread’s MessageQueue.


大概翻译:
Handler 允许 你去发送和处理 消息或者是发送处理绑定在线程消息队列中的runnable对象,每一个Handler实例都联系到一个单一的线程和那个线程的消息队列中。当创建一个新的Handler,他将绑定到这个线程或者是创建Hanlder的线程的消息队列。从这一点上来看,它会传递信息和消息队列的rannables并在消息弹出消息队列时执行它们。Handler有两个主要的用途:1是调度消息和runnables在未来执行的时间;2是为不同线程中所进行的活动排队。

Android 消息处理机制1(从源码分析)_第1张图片

2.为什么要用 handler ?

3.为什么要通过 Handler 更新 UI 呢?

  1. 防止多个线程去更新 UI 造成错乱现象
  2. 加锁影响效率

4.使用 Handler 遇到的问题

  1. 内存泄漏
  2. 消息阻塞,导致 ANR
  3. 子线程不通过Handler 更新UI,会抛异常 (短时间内不会抛出异常 原因:framework api 要判断 sdk >11)
  4. 子线程创建 Handler 没有传 Looper 对象

5.如何实现一个与线程相关的 Handler

Looper

class LooperThread extends Thread {
      public Handler mHandler;

      public void run() {
          Looper.prepare();

          mHandler = new Handler() {
              public void handleMessage(Message msg) {
                  // process incoming messages here
              }
          };

          Looper.loop();
      }
  }

6.HandlerThread 又是什么?

是 Google 为了 简化 异步操作导致 Looper = null 情况下 封装的一个 线程类

HandlerThread handlerThread = new HandlerThread("");
        Handler handler = new Handler(handlerThread.getLooper()){
        @Override
        public void handleMessage(Message msg) {
            //异步操作  耗时操作
        }
    };

7. Android中更新UI的几种方式

  1. Handler post //源码分析 同样发送 Message 对象
  2. Handler 发送 Message 回调 handleMessage();
  3. runOnUiThread(Runnable r); // 内部也采用 Handler 机制
  4. View.post();// 内部也采用 Handler 机制

好了,到此结束~~~
下篇从源码分析Android 消息处理机制

你可能感兴趣的:(Android)