Handler消息传递机制
Handler、Loop及MessageQueue三者的关系
新线程将消息发送至MessageQueue,然后Handler不断从MessageQueue中获取并处理消息。Handler从MessageQueue中读取消息就要用到Looper,Looper的loop方法负责读取MessageQueue中的消息,读取消息之后把消息发送给Handler来处理。
上图很好地展示了这三者之间的关系,可以看出,如果希望Handler正常工作,必须在当前线程中有一个Looper对象。而Looper的创建分为两种情况:
(1)在主线程即UI线程中,系统已默认初始化了一个Looper对象,因此程序可直接创建Handler即可。
(2)开发者新建的子线程中,必须自己创建一个Looper对象并启动它,才可使用Handler。创建Looper对象调用它的prepare()方法即可。
下面来分别归纳一下这三者的作用,如表所示。
在新建的线程中使用Handler的步骤如下:
(1)调用Looper的prepare()方法为当前线程创建Looper对象,创建Looper对象时,Looper的构造方法会自动创建与之匹配的MessageQueue。
(2)Looper创建完成之后,开始创建Handler实例,并重写handleMessage()方法,该方法负责处理来自于其他线程的消息。
(3)调用Looper的loop()方法启动Looper。
例子如下:
练习:使用在线程中使用上述三种方法分别更新某个UI组件
建立XML文件:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/aa"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="1"
android:textSize