关于安卓中的Handler

Handler是用来线程间传递数据,在主线程将Handler实例化,子线程《工作线程,执行较长的耗时业务》可以通过Handler发送数据到主线程,当Looper轮询到Message Queue时,将消息交给

Handler进行处理,通过回调handleMessage(Message msg);方法,将子线程的数据更新到UI界面; 通过Handler处理多线程机制,不影响用户的其他操作,不阻塞主线程,让用户有更好的体验效果;

(一):Handler 是在面试中会问到最多的问题之一,同时它又是我们日常开发常用到的,更是多线程编程必需懂的;

(二):理清Handler 与Looper, MessageQueue,Messsage,Thread间的关系: Handler 我们经常在Activity中直接Handler mHandler=new Handler(); 然后我们就可以用mHandler发送Message了,那么我们的这个Message通过mHandler发送给谁呢? 通过查看源码,我们可以看到:mHandler.sendMessage();方法的内部要调用=====>

sendMessageDelayed(msg, 0);====>sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);===>

enqueueMessage(queue, msg, uptimeMillis);  其实它最终是将Message对像入队MessageQueue中(我们一定要有一个概念,队列就一定要遵循队列的规则,先进先出FIFO,就相当于一个存储器,将所有的Message先保存),Handler中所持有 MessageQueue 对象mQueue从哪里来的呢?且看下面的图片:



      从上图我们可以看到,我们在创建Handler对象时,程序会先获取与当前Thread中获取与当前线程关联的Looper对象(  mLooper = Looper.myLooper()   ),而在Looper中,通过  public static void prepare() { prepare(true);}



ThreadLocal类的使用大家都会吧,sThreadLocal.set(new Looper(quitAllowed));  它在创建Looper对时的时候会去创建MessageQueue对象出来,这样mHandler.sendMessage();发送出来的Message就保存在Looper中的MessageQueue队列中了;那么Looper又干什么呢?Looper.loop();就是一个死循环,不停地查看MessageQueue中有没有数据(即Message);一发现在数据了,就立马取出来  msg.target.dispatchMessage(msg); 将调用Handler对象的dispatchMessage()方法,对Message进行派发处理

扫描二维码关注公众号,回复: 4114839 查看本文章



如上图所示,Handler中的dipatchMessage()方法对Message进行派发处理,于是Message被回调到handlerMessage(msg)方法中了




猜你喜欢

转载自blog.csdn.net/kenderson/article/details/39371773
今日推荐