Android消息机制

具体就是解决子线程无法访问UI的矛盾问题

 

主要指的是Handler运行机制和Looper和MessageQueue的工作过程;

其实就是将某个任务切换到某个线程去执行,比如说子线程不能访问ui,只能在主线程里访问更新UI,子线程访问就会抛异常;

引申:

Android子线程为什么不能访问ui:因为ui线程里的控件都是非线性安全的。如多多线程同时访问同一个控件会引起不可预估的状态。这是不可控的。不可控就意味着致命。有的人可能会以为为啥不加锁。加锁肯定影响ui效率以及阻塞某些线程。肯定不可取。

Android消息机制的大体流程;

大家可以去看源码就能了解了;这里我大体记录一下精髓:

Handler向消息队列(MessageQueue)发送一条消息,MessageQueue通过.next()进行处理然后传给Looper,Looper通过Looper.loop()进行处理最终交给Handler进行分发处理,最总走HandleMessage(Message msg)方法处理。

一句话:Handler自己发送消息最总自己处理。因为Handler是主线程中创建的,最终是在主线程中完成ui的更新

源码缩减为:

Handler.setMessage->Handler.sendMessageAtTime->Handler.enqueueMessage->MessageQueue.enqueueMessage->MessageQueue.next()->Looper.loop()->Handler.dispatchMessage->3.HandleMessage;(或者1.Runnable的run方法或者2.CallBack.HandleMessage).  -------》源码可知:优先级1,2,3.

曾经16年面试有人问我说先有Looper还是先有Handler.   哈哈记忆犹新。

大家看过ActicityThread源码就清楚先有谁了。或者了解Handler的构造方法以及它的几个重载方法也可以了解。

 

引申:子线程一定不能更新ui吗答案是错误的。源码分析:涉及到ViewRoot。 能跟新ui的前提是ViewRootImpl这个对象没有创建出来,如果创建出来了子线程一定不能更新ui会抛异常。

 

其实用起来比较简单。创建Handler的时候注意一下内存泄露问题。基本就ok了。了解源码可以知其然挺好。

 

 

 

 

 

 

 

你可能感兴趣的:(Android消息机制)