[关闭]
@kimo 2016-03-18T08:29:27.000000Z 字数 1166 阅读 1658

android线程通信机制,handler,looper,messageQueue的关系

android


android应用程序是单线程模型的,(注意,此单线程模型并不是指一个应用程序里只有一个线程,而是说这个程序围绕着一个主要的线程)当启动一个应用程序,android会自动创建一个main线程,也叫UI线程。这个线程负责事件的分发以及屏幕的绘制,是一个很重要的线程。

UI线程是线程不安全的,我想可能是android想避免多个线程对屏幕上的数据操作带来的数据混乱的问题,所以只让UI线程操作屏幕上的数据。如果UI线程在操作后都5S没有响应的话,会直接报出Application Not Respond(即ANR)错误(长时间不响应会带来很差的用户体验)。但是耗时的业务逻辑处理又是不可避免的,如大量图片的加载,网络请求等,这些耗时的操作势必不能放在UI线程里。我们必须新开线程来处理。结合前面的线程不安全,您联想到什么没有?有没有一种机制让普通线程把处理结果发送给UI线程呢?

当当当,Handler出场了。伴随Handler的,还有Looper和MessageQueue,Message三位。这四位便组成了android应用程序线程间通信机制。大概流程是这样的,Handler传递Message给MessageQueue,MessageQueue将Message放进它的队列,这时候在UI线程的Looper会不断轮询MessageQueue,取出里面的Message分发或者处理。嗯,就是这样。不要逗我了,普通线程呢,被狗吃辣?客官莫急,待我慢慢道来。

我们一般在Activity这些组件里定义Handler时,此时Handler便是在UI线程里,取得的Looper也是UI线程的Looper,这时候新开一个普通线程,在这个线程里使用mHandler.sendMessage(new Message()) or mHandler.post(new Runnable()),结果便是放在Message或者Runnable里(Runnable会被Handler自
动转换为Message),这就是整个过程。来一幅图以便理解。

  1. public Handler(Callback callback, boolean async) {
  2. ...
  3. mLooper = Looper.myLooper();
  4. if (mLooper == null) {
  5. throw new RuntimeException(
  6. "Can't create handler inside thread that has not called Looper.prepare()");
  7. }
  8. mQueue = mLooper.mQueue;
  9. mCallback = callback;
  10. mAsynchronous = async;
  11. }

这是Handler主要调用的构造函数。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注