Android之Handler

(一)Handler是什么

一套用于更新UI和用于消息发送及处理的机制


(二)Hanler的简单用法

1.更新UI

- 创建Handler对象

- 在子线程中用post方法实现Runnable接口,在run方法中进行UI更新


其他方法:

handler.postDelayed(线程对象,延迟时间);


2.消息处理

- 创建Handler对象,实现hanleMessage:方法

Android之Handler_第1张图片


- 在子线程中的run方法中创建Message对象,并让handler对象执行sendMessage方法:

Android之Handler_第2张图片

(还可以用handler.obtainMessage()方法来创建message对象)

(也可以用message.sendToTarget()方法发送消息,Target就是handler自己)

- message可以传递对象参数,用message.obj = 对象


3.移除消息

handler.removeCallbacks(要移除的线程对象);


(三)Handler与Looper,MessageQueue的关系

- handler:工人——内部与Looper进行关联

- looper:传送带移动的动力——内部包含一个MessageQueue,调用Looper.Looper来不断从消息队列中获取信息

(用Looper.prepare()创建一个looper,内部关联方法会创建一个messagequeue对象

- messagequeue(消息队列):传送带——所有Handler发送的消息都会放进这里

- message:传送带上面的货物。



工人(handler)把自己的产品(message)放在传送带(messagequeue)尾部,在动力(looper)作用下,传送带向前移动,最终产品到达传送带头部,又被工人(handler)取出来处理(handmessage())。


(四)自定义与子线程相关的Handler

- 在子线程中创建handler对象

Android之Handler_第3张图片


在主活动中调用子线程中的handler对象来执行sendMessage方法


解决多线程的Handler可能未创建Looper对象而抛出异常的问题,可以用HandlerThread解决,调用它的getLooper方法可以防止获得空Loop

原理:

Android之Handler_第4张图片


(五)主线程向子线程发送信息:

在主线程的handler对象中的handleMessage方法中调用子线程的handler对象的sendMessage方法


你可能感兴趣的:(Android)