一、什么是Handler
Handler是Android中用来发送、传递、接收信息,处理更新界面UI的一套机制
二、Handler的作用
既可以发送消息,也可以处理消息
三、为什么要用Handler
Android在设计的时候,就封装了一套消息、传递、处理机制,如果不遵循这样的机制,就没有办法更新UI信息,就会抛出异常
四、Handler、Message、MessageQueue、Looper关系
Handler:快递员(属于某个快递公司的职员)
Message:包裹(可以放置很多东西的箱子)
MessageQueue:快递分拣中心(分拣快递的传送带)
Looper:快递公司(具有处理包裹去向的管理中心)
情景分析:在子线程中更新主线程的UI
其中的原理机制可以形象的理解为:
某天,你想给朋友寄一件礼物,首先你拿个箱子装好礼物并包裹好,下单叫了某家的快递员上门取件,快递员揽收你的包裹后,会将包裹送往快递分拣中心,等待配送车送出你的包裹。等配送车来了,就按照你的包裹地址信息,送到指定地方站点,然后分派给相应的快递员,将你的包裹送到你的朋友手里。
这整个邮寄包裹的过程可以形象的理解为Handler的工作机制原理,下面还原一下实际工作过程:
某时,你想刷新主界面的TextView,无奈你不在主线程,此时你就会包装好Message,然后声明一个Handler,让Handler将你的Message送往主线程(Looper),Handler将你的Message送到主线程后,还需要排队等待,等轮到你的时候,主线程就会告诉Handler,这个Message可以处理了,你负责分发一下,于是,Handler将该Message分发到相应的回调或者handleMessage( ) 方法中,于是,你就在该方法中更新了UI。
五、注意
1个线程只能绑定1个Looper,但可以有多个Handler
1个Looper可以绑定多个Handler,但一个Handler只能有一个Looper
六、Handler更新UI常见的方法
runOnUiThread()
handler.post()
handler.sendEmptyMessage()
view.post()
七、非线程可以更新Ui吗?
运行结果:
让线程休眠1秒:
报错了,原因是:
第一个例子中,子线程没有休眠,在Avtivity的生命周期的OnCreate()方法完成了,子线程中更新UI的操作。
第二个例子中,子线程发生了休眠,在Activity的生命周期的OnResume()方法完成了,checkThread()这个方法。而在Activity的Resume()方法会跑一个ViewRootImpl(),而这个ViewRootImpl()里会有一个checkThread()来判断更新UI的线程是不是主线程。如果不是就会抛出异常。
------------------------