Looper的作用及工作原理

2021/12/5 23:17:30

本文主要是介绍Looper的作用及工作原理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Looper的使用一般离不开Handler及MessageQueue

直入主题:Looper是负责管理MessageQueue,会不断从MessageQueue中取出消息,并将消息分给对应的Handler来处理。每个线程只允许有一个Looper,且主线程中,系统已经初始化好了一个Looper对象。

接下类分别讲讲Handler以及MessageQueue:

Handler:Handler的使用离不开Message,Message是封装了需要传递的数据教交由Handler处理的对象,而Handler的作用便是发送Message以及处理Message;

MessageQueue:消息队列,它采用先进先出的方式来管理Message,程序创建Looper对象时,会在它的构造器中创建MessageQueue对象,Looper的构造器源码如下:

private Looper(){
   mQueue = new MessageQueue();
   mRun = true;
   mThread = Thread.currentThread();
}

Handler在发送的消息必须被送到指定的MessageQueue中进行保存,而创建MessageQueue对象的前提是创建Looper,且MessageQueue是由Looper负责管理的。也就是说。如果希望Handler的
正常工作,当前线程中必须有一个Looper对象

在创建Handler对象时,无参构造已经被弃用了(原因可自查),所以我们一般使用Handler(Looper looper)构造器,参数一般填入Looper.myLooper()或者Looper.myLooper(),myLooper()方法表示获取当前线程中的Looper对象,而getMainLooper()方法则表示获取主线程中的已经初始化好了的Looper方法。

在主线程中,无需创建Looper对象,并且myLooper()和getMainLooper()的返回值是一样的。而在子线程中,创建Handler对象时传入的是myLooper()方法,便需要手动创建Looper对象,并启动它。创建Looper对象调用它的prepare()方法即可。prepare()方法保证了每个线程只有一个Looper对象,即当前线程已经存在Looper对象时,调用该方法是不会再创建一个Looper对象的,接下来便是调用Looper的loop()方法来启动它,loop()方法是负责读取MessageQueue中的消息,读到消息之后就把消息交给发送该消息的Handler进行处理,所以若没有调用该方法,虽然创建Handler对象时不会报错,但是也无法接收到发送过来的消息。

Toast如何在子线程中运行?

由于Toast是通过Handler来实现的,所以Toast运行的线程中也需要Looper对象的支持,若要想Toast能在子线程中运行,便需要手动创建一个Looper对象。



这篇关于Looper的作用及工作原理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程