我理解的Handler,messageQueue,Looper,Messager,HandlerThread.
来源:互联网 发布:数据脱敏的主要方法 编辑:程序博客网 时间:2024/06/05 10:56
网上深入讲这些知识的很多,我就写一些总结性与结论性的东西吧。
1.一个app在开启时会给我们创建Looper,MessageQueue是Looper的成员变量,在Lp的构造中被new MessageQueue(),一个线程对应一个Looper,一个Looper对应一个MessageQueue.
2.Handler的构造方法中会获取其所在线程的Looper与MessageQueue,通过成员变量来保存,有则绑定,无则报错。在用handler发送消息后,Message内部会通过变量target保存handler(把自己发送出去的),方便后续回调,同时,把Messager放入到了MessageQueue中,实现轮循消息队列中的消息。
3.Looper调用loop()方法,该方法是一个死循环,即安卓系统只要不崩溃,该方法就会一直执行,至于为什么不会ANR,网上说这是网易的一个面试题,网友没有给出原理,据说是因为:该looper,处理安卓所有的主线程的消息,当然包括系统消息,如果ANR了,则系统便无法继续运行下去,因此是一个无限循环是没问题的,至于,如何强制退出,下面会讲到。接着讲loop(),该方法中,每次从MessagerQueue中拿到消息,就会调用msg.target.dispatchMessage(msg);即发送消息的handler的方法。在该方法中,有一个判断,如果消息是一个callback对象则走对象的run(),否则走handler的handlerMessager(),这也是为何可以用持有主线程Looper的handler来实现直接更新UI操作的原因了。
4上面讲到退出looper()方法,两种方法,Looper.quit(),Looper.quitSafely(),前者直接清空MessageQueue里的所有消息,使Looper无法工作,后者只是清空一些延迟执行的Message,让handler可以执行完重要的Message后停止执行。
5.在主线程中更新UI还是在子线程中更新UI,重点在Looper,只要handler持有的Looper是主线程的,即Handler handler = new Handler(Looper.getMainLooper());则该handler在哪里都可以更新UI的,实现在子线程中更新UI。
6.通过Handler加HandlerThread来实现处理耗时操作,HandlerThread就是一个初始化了looper的子线程,可以通过它把looper以构造的形式传递给handler,从而主线程的handler也将可以处理耗时操作了。
7.在HandelerThread的内部,getLooper()方法里有wait()方法,而其构造方法中有notifyAll()方法,是为了实现线程传参的同步。即UI线程中的Handler会执行的更快一些,所以在它构造里的值用一个可以等待的方法来传值,当等到HandlerThread的run()方法执行完毕了,即Looper初始化完毕了,再唤醒getLooper(),从而成功 把子线程中的looper传递给了handler对象。
- 我理解的Handler,messageQueue,Looper,Messager,HandlerThread.
- Handler Looper MessageQueue HandlerThread的那些事
- 对Handler,Looper,messagequeue,HandlerThread的深入理解,Handler常见面试题
- Message,MessageQueue,Looper,Handler,HandlerThread
- Android-Handler 总结(Handler 的使用 ,Looper , MessageQueue , HandlerThread )
- Android-Handler 总结(Handler 的使用 ,Looper , MessageQueue , HandlerThread )
- android Thread HandlerThread Looper Message MessageQueue Handler的关系
- android Thread HandlerThread Looper Message MessageQueue Handler的关系
- Handler,looper,MessageQueue及 handlerThread 之间的关联和用法
- android Thread HandlerThread Looper Message MessageQueue Handler的关系
- Looper,Handler, HandlerThread,Message,MessageQueue分析
- [Android]Handler-Looper-MessageQueue-Message、HandlerThread
- Handler、Looper、MessageQueue、Message、HandlerThread以及ActivityThread
- Message,MessageQueue,Looper,Handler的理解
- Android中Looper, Handler, MessageQueue的理解
- Android中的Looper,MessageQueue,Handler的理解
- 理解Handler、Looper、MessageQueue的关系
- Handler Looper Message MessageQueue的理解
- http状态码
- HDPCD-Java-复习笔记(9)-lab
- 数据结构---多项式的乘积与和(PTA)
- vivado xilinx 网盘资料
- Linux IPC 2之管道
- 我理解的Handler,messageQueue,Looper,Messager,HandlerThread.
- Go Get安装一些第三方库-网络问题
- 用Qt实现基于网络请求的用户登录(二)
- 大数据Sqoop_09
- 0x5f3759df的数学原理 ----一种快速开方根求倒原理
- JS阻止事件冒泡兼容各浏览器
- 分布式系统的高效运维要点
- 截取视频图片
- poj 1236 Network of Schools 强连通分量