Handler 使用方法详解

作者: 程序员Android1 | 来源:发表于2017-10-08 13:12 被阅读43次

HandlerAndroid中用来更新UI 的一套消息处理机制。Handler 允许线程间发送MessageRunnable对象进行通信。在Android中UI修改只能通过UI Thread,子线程不能更新UI。如果子线程想更新UI,需要通过 Handler发送消息给主线程,进而达到更新UI的目的。

本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

  1. Handler 消息处理机制原理
  2. Handler 机制处理的4个关键对象
  3. Handler常用方法
  4. 子线程更新UI 异常处理
  5. 主线程给子线程发送消息的方法
  6. 子线程给主线程发送消息的方法
  7. 主、子 线程 互发消息方法
  8. 子线程方法中调用主线程更新UI的方法

欢迎关注微信公众号:程序员Android
公众号ID:ProgramAndroid
获取更多信息

微信公众号:ProgramAndroid

我们不是牛逼的程序员,我们只是程序开发中的垫脚石。
我们不发送红包,我们只是红包的搬运工。

Handler 简介

继承关系如下:

java.lang.Object
   ↳    android.os.Handler

1. Handler 消息处理机制原理

Android 应用程序创建的时候,系统会给每一个进程提供一个LooperLooper 是一个死循环,它内部维护一个消息队列,Looper不停的从消息队列中取Message,取到的消息就发送给handler,最后Handler 根据接收的消息去修改UI等。

2. Handler 机制处理的4个关键对象

1.Message

线程之间传递的消息,可以携带一些简单的数据供子线程与主线程进行交换数据。

2.Message Queue

存放通过Handler 发送的Message 的消息队列,每一个线程只有一个消息队列。

3.Handler

消息处理者,主要用于发送跟处理消息。

主要功能:
发送消息SendMessage()
处理消息 HandleMessage()

4.Looper

内部包含一个死循环的MessageQueue,用于存储handler发送的MessageLooper则是不断的从消息队列中取消,如果有消息就取出发送给Handler 处理,没有则阻塞。

总结:

Handler负责发送MessageMessage QueueLooper负责从Message Queue 遍历Message ,然后直接把遍历的消息回传给Handler自己,通过Handler自身的handleMessage处理更新UI等操作。

主线程、子线程间通信简单流程

3. Handler常用方法

1.Runnable对象

  • post(Runnable)

使用方法举例:

post(Runnable) 使用方法举例
  • postAtTime(Runnable, long)
  • postDelayed(Runnable, long)

2. Message 对象

  • sendEmptyMessage(int)

使用方法举例:

sendEmptyMessage使用方法举例
  • sendMessage(Message)

使用方法举例:

sendMessage 举例
  • sendMessageAtTime(Message, long),
  • sendMessageDelayed(Message, long)

3.接收、处理Message

  • handleMessage(Message)

使用方法举例:


handleMessage 接收处理 message

4. 子线程更新UI 异常处理

子线程不能更新UI,如果在子线程中更新UI,会出现CalledFromWrongThreadException 异常。

  • CalledFromWrongThreadException
CalledFromWrongThreadException 子线程不能更新UI

解决方法:

子线程通过Handler发送消息给主线程,让主线程处理消息,进而更新UI

5. 主线程给子线程发送消息的方法

此例子中子线程通过Looper不断遍历主线程发送的消息,Looper使用方法如下:

    1. 准备Looper 轮询器

Looper.prepare();

    1. Handler 处理遍历消息

Handler mHandler = new Handler()

    1. 遍历消息队列

Looper.loop();

Looper 使用方法如下:

Looper 遍历消息循环的方法

主线程发送消息给子线程 的使用例子如下:

主线程发送消息给子线程

6. 子线程给主线程发送消息的方法

子线程发送消息给主线程方法

子线程发送消息 主线程接收并处理消息的方法

7. 主、子 线程 互发消息方法

主要实现主、子线程每隔1s中通信一次

  • 实现打印Log如下:
主、子线程通信log信息
  • 实现方法如下:
子线程发送消息 主线程接收消息

8.子线程方法中调用主线程更新UI的方法

Activity 中 可以使用 runOnUiThread(Runnable)

子线程中使用runOnUiThread(Runnable)更新UI

子线程使用 Handler.post(Runnable)

在子线程中使用Handler.post(Runnable)更新UI

View.post()

View.post() 在子线程中调用主线程方法更新UI

Handler.sendMessage(Message)

子线程发送消息

至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。期待您的关注,
感谢您的阅读,谢谢!

​欢迎关注微信公众号:程序员Android
公众号ID:ProgramAndroid
获取更多信息

微信公众号:ProgramAndroid

我们不是牛逼的程序员,我们只是程序开发中的垫脚石。
我们不发送红包,我们只是红包的搬运工。

点击阅读原文,获取更多福利


相关文章

网友评论

    本文标题:Handler 使用方法详解

    本文链接:https://www.haomeiwen.com/subject/wudjyxtx.html