handler 是什么 ?
handler 是 android 给我们提供用来更新 【UI】 的一套机制,也是一套消息处理的机制。我们可以发送消息,也可以通过它处理消息
为什么要用 handler ? 不用可以吗?
不用是不行的。
Android 在设计的时候,就封装了一套消息的创建、传递、处理者3个完整的机制,如果不遵循这样的机制就没有办法更新 【UI】 信息的,就会抛出异常信息。
handler 怎么用?
- sendMessage
- sendMessageDelayed
- post(Runnable)
- postDelayed(Runnable,long)
以上四种方式,原理都是使用 handler 。
android 为什么要设计只能通关 handler 机制更新 UI ?
最根本的目的就是为了解决多线程并发问题。
假设在一个 Activity 当中,有多个线程去更新 UI,而且都没有加锁机制,那么会产生什么样子的问题呢?————更新界面错乱
如果对更新 UI 的操作都进行加锁处理的话又会产生什么样子的问题?———— 性能下降处于对以上目的问题的考虑,android 给我们提供了一套更新 UI 的机制,我们只需要遵循这样的机制就可以了。
根本不用去关系多线程的问题,所以更新下 UI 的操作,都是在主线程的消息队列当中去轮询处理的
handler 的原理是什么
handler 封装了消息的发送(主要包括发送给谁)
- 内部包含一个消息队列也就是 MessageQueue,【所有】的 Handler 发送的消息多走向这个消息队列
- Looper.loop() 方法,就是一个死循环,不断的从 MessageQueue 取消息,如有消息就出来,没有就【堵塞】
MessageQueue
就是一个消息队列,可以添加消息,并处理消息
handler 也很简单,内部会跟 Looper 进行关联,也就是说在 handler 的内部可以找到 Looper ,找到了 Looper 也就找到了,MessageQueue,在 Handler 中发送,其实就是向。。。
总结: handler 负责发送消息,looper 负责接收 handler 发送的消息,并直接把消息回传给 handler 自己,messageQueue 就是一个存储消息的容器
如何实现一个和线程相关的 handler
HandlerThread thread = new HandlerThread("thred name");
thread.start();
Handler handler = new Handler(thread.getLooper());
HandlerThread 又是什么
如何在主线程给子线程发送消息呢
android 中更新 UI 的几种方式
activity 中的 runOnUiThread
handler 中的 post
handler 中的 sendMessage
view 中的 post