Handler、Looper

一:Looper和Handler模型:

 

 

 

 

 

 

二:怎样在thread中使用Looper和Handler

  1. 方法介绍:

     

     

  2. 使用示例:

     

     

  3.  

     

 

三:对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);
}
 

 

posted @ 2021-07-29 17:40  ou尼酱~~~  阅读(146)  评论(0)    收藏  举报