持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
Android异步处理
Android
在处理异步消息时涉及到Handle
、Looper
、Message
以及MessageQueue
。
Handler
主要是消息发送和接收者,负责将Message
发送到Looper
和接收Looper
的消息。Looper
是作为"传送带"的角色,连接了Handler
和MessageQueue
,而消息循环机制由Looper
实现。Message
是消息数据,表示通信的数据信息MessageQueue
是单链表数据结构的消息队列,存放Message
列表。
一般情况下在Activity
页面异步处理事件结束以后希望更新UI时就会用到Handler
:异步子线程希望更新UI线程内容时,通过向主线程Handler
发送Message
来通知主线程处理事件。
Thread线程
在Android
中Thread
主要用于处理一些耗时操作,例如常用于网络请求、下载资源、加载图片或者上传资源时。另外Android
中也有主线程的概念,主线程主要用于处理UI操作,默认也就叫UI线程。当一些耗时操作就不能在UI线程去执行,这样就会导致UI卡顿阻塞主线程事件处理影响用户使用体验,因此耗时操作不能在主线程中执行以避免出现ANR的情况。
HandlerThread
HandlerThread
继承Thread
,也是一个线程类。
HandlerThread
内部有Looper
对象来进行looper
循环。- 通过获取
HandlerThread
的looper
对象传递给Handler
对象,可以在handleMessage
方法中执行异步任务。 - 创建
HandlerThread
后必须先调用HandlerThread.start()
方法,Thread
会先调用run
方法,创建Looper
对象。
HandlerThread
简单说就是便捷式异步线程创建Handler
消息通知功能。因为正常情况下在主线程新建Handler
,它的回调方法handlerMessage
是在主线程执行而子线程创建的Handler
回调方法handlerMessage
是在异步线程。其主要是主线程发通知给子线程在子线程中处理消息;和在主线程新建Handler
,在子线程发送通知正好相反。
mHandlerThread = new HandlerThread("myThread");
mHandlerThread.start();
//创建并传入子线程的Looper对象
Handler mHandlerChild = new Handler(mHandlerThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
//handleMessage回调是在子线程中
......
};
Thread缺点
- 使用
new Thread()
比较消耗性能 new Thread()
不利于管控,线程之间会存在竞争关系- 不利于扩展、中断以及线程控制
推荐使用线程池来管控子线程使用,可以复用和控制线程开销。保证在有效CPU资源范围内合理良好使用异步处理能力。
总结
Thread()
使用场景较为单一,不适用于绝大多数场景。在实际开发中也是推荐使用线程池形式有助于全局管理和监控线程使用。但在一些特殊场景下或许Thread
也是一种快速落地和解决问题的一种手段方式。