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进行派发处理
如上图所示,Handler中的dipatchMessage()方法对Message进行派发处理,于是Message被回调到handlerMessage(msg)方法中了