Android-Handler机制详解

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方法进行通知主线程。这样作的好处好比有些图片的加载啊,网络的访问啊可能会比较耗时,因此放到子线程里面作是比较合适的。
相关文章
相关标签/搜索