异步消息处理机制相关面试问题
Handler
什么是Handler
Handler通过发送和处理Message与Runnable对象来关联相对应线程MessageQueue。
1. 可以让对应的Message和Runnable在未来的某个时间点进行相应处理
2. 让自己想要处理的耗时操作放在子线程,让更新UI的操作放在主线程
handler的使用方法
- post(runnable)
- sendMessage(message)
handler的机制原理
handler引起的内存泄漏以及解决办法
原因:静态内部类持有外部类的匿名引用,导致外部activity无法释放
解决方法:handler内部持有外部acitivity的弱引用,并把handler改为静态内部类,在onDestory()中mHandler.removeCallback().
AsyncTask
什么是AsyncTask
本质上是一个封装了线程池和handler的异步框架
使用方法
三个参数
5个方法
AsyncTask机制原理
- AsyncTask的本质是一个静态的线程池,AsyncTask派生出的子类可以实现不同的异步任务,这些任务都是提交到静态的线程池中执行。
- 线程池中的工作线程质细腻个doInBackgrond(mParams)方法执行异步任务
- 当任务状态改变之后,工作线程会向UI线程发送消息,AsyncTask内部的InternalHandler响应这些消息,并调用相关的回调函数
注意事项
- 内存泄漏(与Handler相似)
- 生命周期(与Handler相似,应在Activity销毁时,调用cancel())
- 结果丢失(与Handler相似,都是因为持有了Activity的引用)
- 并行or串行
handlerThread
handlerThread是什么
产生背景
开启Thread子线程进行耗时操作,但是多次创建和销毁线程是很耗费系统资源的
本质
本质上是一个handler+thread+looper,是一个thread内部有looper
3.特点
- HandlerThread本质上是一个线程类,它继承了Thread;
- HandlerThread有自己的内部Looper对象,可以进行looper循环;
- 通过获取HandlerThread的looper对象传递给Handler对象,可以在handlerMessage方法中执行**异步任务**。
- 优点是不会有阻塞,减少了对性能的消耗,缺点是不能同时进行多任务的处理,需要等待进行处理,处理效率低。
- 与线程池注重并发不同,HandlerThread是一个串行队列,HandlerThread背后只有一个线程。
handlerThread源码解析
IntentService
含义
优先级比普通的Service高,内部封装了handlerThread()与handler的异步框架。
IntentService是继承并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样,同时,在所有任务执行完后,IntentService会自动停止,而不需要我们手动去控制或stopSelf()。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent()回调方法中执行,并起,每次只会执行一个工作线程,执行完第一个再执行第二个(串行)。
- 本质是一种特殊的Service,继承自Service并且本身就是一个抽象类
- 内部通过HandlerThread与Handler实现异步操作
使用方法
复写构造方法与onHandleIntent(),onHandleIntent()为异步方法,可以执行耗时操作。