-
handler用法
post(Runnable)
postDelayed(Runnable, long)
得到message: handler.obtainMessage();
message.sendToTarget()
handler.removeCallbacks(runnable);
拦截消息
查看全部 -
创建一个handler时,默认与一个线程进行绑定,默认线程里面有一个消息队列
查看全部 -
为什么要用handler
android在设计开发的时候,就封装了一套消息创建,传递,处理机制,如果不遵循这样的机制,就没有办法更新ui信息,就会抛出异常
查看全部 -
handler是什么
handler是android给我们提供用来更新ui的一套机制,也是一套消息处理机制,我们可以发送消息,也可以通过它来处理消息
两个作用
更新ui
封装了一套消息处理机制
查看全部 -
使用Handler时必须要关联一个Looper对象,否则就会回抛出"Can't create handler inside thread that has not called Looper.perpare()"
查看全部 -
在Activity的ViewRootImpl没有被创建之前是可以在子线程中更新UI的。
因为检查更新UI的逻辑是否是在主线程中是在ViewRootImpl中进行检查的。
而ViewRootImpl对象的创建时在Activity.onResume() 方法中被创建的。
所以在ViewRootImpl对象没有被创建之前是可以在子线程中更新UI的。
但是强烈建议不要在子线程中更新UI,因为不能绝对保证在子线程中更新UI是ViewRootImpl对象没有被创建
查看全部 -
View.post(Runnable action) 源码解析:
View的成员变量AttachInfo 不为null.则通过AttachInfo中的Handle.post(action)发送消息
如果View的AttachInfo为null则通过ViewRootImpl.getRunQueue().post(action)发送消息
查看全部 -
runOnUiThread(Runnable action)方法源码解析
判断是否为UI线程,不是则同Handler。post(action),如果是则action.run()直接运行
查看全部 -
getPostMessage(Runnable r)中将r对象赋值给message的callback属性,最后在处理消息时如果callback不为null,则执行callback,不在同Handler将消息分发给handlerMessage方法了
查看全部 -
Handler post Runnable 方法的源码跟入解读
查看全部 -
通过HandlerThread 对象 使得Handler与子线程关联,并向子线程中发送消息,在子线程的消息循环中处理消息;
HandlerThread中包含了线程同步的逻辑,保证Looper对象不为null
查看全部 -
与线程相关的Handler代码示例:
Handler通过当前线程的mThreadLocal.get()方法得到Looper对象查看全部 -
从MessageQueue中取出的Message后给Message对象设置target,该target就是handler对象本身,handler分发消息并处理消息
查看全部 -
Handler 发送消息的过程实际上是利用主线程中的Looper对象的MessageQueue成员变量,将消息放到消息队列中
查看全部 -
Handler 发送消息源码跟入
查看全部 -
Handler的dispatchMessage(Message msg)源码解析:
if(msg.callback !=null){
handlerCalback(msg);
}else{
if(mCallback !=null){
if(mCallback.handleMessage(msg)){return}
}
handleMessage(msg);
}
查看全部 -
最终通过消息的target将消息发给Handler,进行处理。源代码:
msg.target.dispatchMessage(msg); // target即为Handler对象
查看全部 -
Looper.loop()方法源码解读
通过myLooper()方法取出Looper对象,进而取出MessageQueue对象,最后从MessageQueue消息队列中取出消息(queue.next())
查看全部 -
消息放到消息队列中的源码
queue.enqueueMessage(msg,uptimeMills);
查看全部 -
进而得到Looper对象当中的成员变量MessageQueue,进而循环放入、取出消息并传给Handler进行消息循环处理
查看全部 -
Handler 关联 Looper的源代码
mLooper = Looper.myLooper()// myLooper通过mThreadLocal.get()方法返回线程关联的Looper对象
查看全部 -
Lopper对象中包含成员变量MessageQueue,线程标记mThread
查看全部 -
Looper.prepareMainLooper() 通过ActivityThread的ThreadLocal成员变量关联了Looper和当前线程(即主线程)
查看全部 -
main方法中
Looper.prepareMainLooper()
查看全部 -
回顾ActivityThread main方法 : Looper Message
查看全部 -
Handler / Looper / MessageQueue 总结
查看全部 -
为何只能通过Handler进行更新UI?
解决多线程并发问题;
查看全部 -
Handler / Looper / MessageQueue 三者的关系
查看全部
举报