Android之Handler
(一)Handler是什么
一套用于更新UI和用于消息发送及处理的机制
(二)Hanler的简单用法
1.更新UI
- 创建Handler对象
- 在子线程中用post方法实现Runnable接口,在run方法中进行UI更新
其他方法:
handler.postDelayed(线程对象,延迟时间);
2.消息处理
- 创建Handler对象,实现hanleMessage:方法
- 在子线程中的run方法中创建Message对象,并让handler对象执行sendMessage方法:
(还可以用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对象
在主活动中调用子线程中的handler对象来执行sendMessage方法
解决多线程的Handler可能未创建Looper对象而抛出异常的问题,可以用HandlerThread解决,调用它的getLooper方法可以防止获得空Loop
原理:
(五)主线程向子线程发送信息:
在主线程的handler对象中的handleMessage方法中调用子线程的handler对象的sendMessage方法