您的位置:首页 > 其它

Handler的一些理解总结

2016-05-16 11:39 246 查看
Handler主要作用从其他线程访问UI线程
一般在新的线程里发送信息,在主线程里处理消息。
Message,MessageQueue,handler,Looper之间的关系
Handler发送Message到MessageQueue(先进先出),Looper负责读取MessageQueue中的消息给Handler去进行处理。
关于Looper的使用。
如果希望Handler正常工作,必须在当前线程中有一个Looper对象。
如果在UI线程中直接创建Handler实例,不需要创建Looper对象了,在UI线程中,系统初期化时已经创建Looper对象了。
如果在一个新的线程中,在创建一个Handler对象之前,必须为该线程准备一个Looper对象,(Looper.prepare),然后让
Looper跑起来(Looper.loop),去读取MessgerQueue中的Message,这样Handler才能正常工作。

有以下4种方式可以从其它线程访问UI线程:

·      Activity.runOnUiThread(Runnable)

·      View.post(Runnable)

·      View.postDelayed(Runnable,
long)

·      Handler
其中,重点说一下的是View.post(Runnable)方法。在post(Runnable action)方法里,View获得当前线程(即UI线程)的Handler,然后将action对象post到Handler里。在Handler里,它将传递过来的action对象包装成一个Message(Message的callback为action),然后将其投入UI线程的消息循环中。在Handler再次处理该Message时,有一条分支(未解释的那条)就是为它所设,直接调用runnable的run方法。而此时,已经路由到UI线程里,因此,我们可以毫无顾虑的来更新UI。

几点小结

·      Handler的处理过程运行在创建Handler的线程里

·      一个Looper对应一个MessageQueue

·      一个线程对应一个Looper

·      一个Looper可以对应多个Handler

·      不确定当前线程时,更新UI时尽量调用post方法

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: