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

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


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

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

当当当,Handler出场了。伴随Handler的,还有LooperMessageQueueMessage三位。这四位便组成了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),这就是整个过程。来一幅图以便理解
img

public Handler(Callback callback, boolean async) {
        ...
        mLooper = Looper.myLooper();
        if (mLooper == null) {
            throw new RuntimeException(
                "Can't create handler inside thread that has not called Looper.prepare()");
        }
        mQueue = mLooper.mQueue;
        mCallback = callback;
        mAsynchronous = async;
    }

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值