Handler
一、handler是什么?
答:handler是更新UI界面的机制,也是消息处理的机制,咱们能够发送消息,也能够处理消息
二、为何要有Handler?
答:Android在设计的时候,封装了一套消息建立、传递、处理机制,若是不遵循这样的机制就没办法更新UI信息,就会抛出异常。
三、handler怎么用?
答:一、post(Runnable);
二、postDelayed(Runnable ,long);
三、sentMessage
四、sentMessageDelayed
四、Android为何要设置只能经过Handler机制更新UI?
答:最根本的问题解决多线程并发的问题;
假设若是在一个Activity中,有多个线程去更新UI,而且都没有加锁机制,马么会产生生么样的问题?——更新界面混乱;
若是对更新UI 的操做都加锁处理的话会产生什么样子的问题?——性能降低
对于上述问题的考虑,Android提供了一套更新UI的机制,咱们只须要遵循这样的机制就行了。
不用关心多线程的问题,更新UI的操做,都是在主线程的消息队列当中轮询处理的。
五、handler的原理是什么?
答:一、handler封装消息的发送(主要包括消息发送给谁)
二、Looper——消息封装的载体。(1)内部包含一个MessageQueue,全部的Handler发送的消息都走向这个消息队列;(2)Looper.Looper方法,就是一个死循环,不断地从MessageQueue取消息,若是有消息就处理消息,没有消息就阻塞。
三、MessageQueue,一个消息队列,添加消息,处理消息
四、handler内部与Looper关联,handler->Looper->MessageQueue,handler发送消息就是向MessageQueue队列发送消息。
总结:handler负责发送消息,Looper负责接收handler发送的消息,并把消息回传给handler本身。
MessageQueue存储消息的容器。
六、HandlerThread的做用是什么?
答:
HandlerThread
thread
=
new
HandlerThread(
"handler thread"
);自动含等待机制,等Looper建立好了,才建立Handler,避免出现空指针异常。
七、主线程
* ActivityThread 默认建立main线程,main中默认建立Looper,Looper默认建立MessageQueue
* threadLocal保存线程的变量信息,方法包括:set,get
八、Android更新UI的方式?
答:一、runOnUIThread
二、handler post
三、handler sendMessage
四、view post
九、非UI线程真的不能更新UI吗?
答:不必定,之因此子线程不能更新界面,是由于Android在线程的方法里面采用checkThread进行判断是不是主线程,而这个方法是在ViewRootImpl中的,这个类是在onResume里面才生成的,所以,若是这个时候子线程在onCreate方法里面生成更新UI,并且没有作阻塞,就是耗时多的操做,仍是能够更新UI的。
十、使用Handler遇到的问题?
答:好比说子线程更新UI,是由于触发了checkThread方法检查是否在主线程更新UI,还有就是子线程中没有Looper,这个缘由是由于Handler的机制引发的,由于Handler发送Message的时候,须要将Message放到MessageQueue里面,而这个时候若是没有Looper的话,就没法循环输出MessageQueue了,这个时候就会报Looper为空的错误。
十一、主线程怎么通知子线程?
答:能够利用HandlerThread进行生成一个子线程的Handler,而且实现handlerMessage方法,而后在主线程里面也生成一个Handler,而后经过调用sendMessage方法进行通知子线程。一样,子线程里面也能够调用sendMessage方法进行通知主线程。这样作的好处好比有些图片的加载啊,网络的访问啊可能会比较耗时,因此放到子线程里面作是比较合适的。