一:Looper和Handler模型:
二:怎样在thread中使用Looper和Handler
- 方法介绍:
- 使用示例:
-
三:对MessageQueue消息队列的介绍
(Message.obtain从消息池中取一个Message避免创建过程,提高效率)
四:如何与main thread主线程交流
五:使用HandlerThread来简化在一个thread中创建looper和handler
感觉自定义一个thread来继承HandlerThread没什么意思,第二种方法看起来实用性更强。HandlerThread内部自带looper,方便很多。
一个继承HandlerThread的例子:
class MyThread (name:String):HandlerThread(name){
init {
start()//这一步进行之后,自带的looper也prepared了,才能和一个handler绑定
}
private val handler:Handler = Handler(looper)
fun execute(task:Runnable):MyThread{
handler.post(task)
return this
}
}
六:感悟
一个handler和一个looper即thread来绑定,如果handler绑定后台looper(后台线程),那它执行的任务就是在后台进行。如果想和main thread通信,想在main thread中去更新UI或其他事情,就搞一个handler,拿它来和main thread的looper绑定,然后把消息传给这个handler就可以了。
对于想handler帮做事,如果要发送Message给它,则得override这个handlerMessage方法;亦或发送一个runnable对象给它也可以。如果发送Message又没有override Handler本身的handleMessage的话,就什么也不做,因为Handler本身的handleMessage是空的。
/**
* Subclasses must implement this to receive messages.
*/
public void handleMessage(@NonNull Message msg) {
}
当然handler的构造函数里有提供callback的这个构造函数,其实这个会使用这个callback当handleMessage来使用,这种时候就不用另外override handleMessage。
**
* Callback interface you can use when instantiating a Handler to avoid
* having to implement your own subclass of Handler.
*/
public interface Callback {
/**
* @param msg A {@link android.os.Message Message} object
* @return True if no further handling is desired
*/
boolean handleMessage(@NonNull Message msg);
}