Handler对象与其调用者在同一线程中,如果在Handler中设置了延时操作,则调用线程也会堵塞。每个Handler对象都会绑定一个Looper对象,
每个Looper对象对应一个消息队列(MessageQueue)。如果在创建Handler时不指定与其绑定的Looper对象,系统默认会将当前线程的Looper绑定到该Handler上。
在主线程中,可以直接使用new Handler()创建Handler对象,其将自动与主线程的Looper对象绑定;
在非主线程中直接这样创建Handler则会报错,因为Android系统默认情况下非主线程中没有开启Looper,而Handler对象必须绑定Looper对象。
这种情况下,需先在该线程中手动开启Looper(Looper.prepare()-->Looper.loop()),然后将其绑定到Handler对象上;
或者通过Looper.getMainLooper(),获得主线程的Looper,将其绑定到此Handler对象上。
Handler发送的消息都会加入到Looper的MessageQueue中。
一说Handler包含两个队列:线程队列和消息队列;使用Handler.post()可以将线程对象加入到线程队列中;使用Handler.sendMessage()可以将消息对象加入到消息队列中。
通过源码分析证实,Handler只有一个消息队列,即MessageQueue。通过post()传进去的线程对象将会被封装成消息对象后传入MessageQueue。
使用post()将线程对象放到消息队列中后,当Looper轮询到该线程执行时,实际上并不会单独开启一个新线程,而仍然在当前Looper绑定的线程中执行,
Handler只是调用了该线程对象的run()而已。如,在子线程中定义了更新UI的指令,若直接开启将该线程执行,则会报错;而通过post()将其加入到主线程的Looper中并执行,就可以实现UI的更新。
使用sendMessage()将消息对象加入到消息队列后,当Looper轮询到该消息时,就会调用Handler的handleMessage()来对其进行处理。
详细解决方案
handler理解再学习之二
热度:31 发布时间:2024-02-08 18:39:29.0
相关解决方案
- C++/CLI Tracking Handler 传参有关问题
- does not contain handler parameter named 'method' 错误
- (四)事件处理――(10)事件处理上下文(Event handler context)
- handler 与listener的差异
- does not contain handler parameter named 'opp'. This may be caused by whitespace in the label text解决方案
- Java!the source attachment does not contain the source for the file Handler.clas解决办法
- Android的消息机制学习(1)Looper,Handler,MessageQueue
- 常看到一些类命名为Helper,Handler,Impl的,这些都是什么意思啊该如何处理
- 回调,handler,广播 效率有关问题
- Android主线程的讯息系统(Handler\Looper)
- 深入理解Looper、Handler、Message之间关系
- android Handler Thread Looper 组合用法
- Android消息传递源码了解。Handler,Looper,MessageQueue,Message
- Android中的Can't create handler inside thread that has not called Looper.prepare()错误
- Handler、Looper跟MessageQueue运行的基本过程
- Handler 接收Parcelable ArrayList时返回空指针,该如何解决
- Android Handler Message小结
- Android消息处理处罚机制(Handler、Looper、MessageQueue与Message)
- android源码解析-Handler
- CE6.0 VMProcessPageFault Error: Page fault occurred while in power handler!解决方案
- 使用ClipboardManager遇到Can't create handler inside thread that has not called Looper.prepare()
- 深入了解Android的消息处理系统-Handler、Looper、Thread学习记录
- 求教~新人理解 Handler 异步 时的有关问题
- Handler 的postDelayed 这步骤的作用是什么
- android之线程的施用(handler,messageQueue)
- Android中的MessageQueue,Handler,Looper跟Thread
- android札记-android中的多线程-Handler, Looper, MessageQueue, Message类
- Android Handler(4)
- Android Handler(6)
- handler.postDelayed(runnable,1000)这个可以起到异步成效吗