android异步消息处理线程

普通的线程,在start执行run方法完毕,则线程自动结束。

异步消息处理线程是指,在线程中调用looper.loop方法创建一个循环体,该方法会循环取出消息队列MessageQueue中的消息进行处理(默认先进先出),取出的消息在handler的handlemessage中处理。所以在该线程的Run方法中,首先调用looper.perpare方法new一个looper对象,looper对象中会创建消息队列,然后new一个handler对象,之后调用looper.loop方法循环取出消息调用msg.target.dispatchMessage(msg)(msg.target就是handler)该方法会调用handler的handlemessage处理消息。在其他线程中调用handler的sendmessage(该方法会调用messagequeue的enquemesage插入消息)方法发送需要处理的消息到该线程中即可。如图


关键步骤:

1、线程局部存储变量类型(TLS):ThreadLocal类,该类存储的变量作用域为定义它的线程。但并不是解决多线程共享变量的安全问题的,因为实际上是每个线程使用ThreadLocalMap各自存储了自己的变量,每个线程中有一个ThreadLocalMap,ThreadLocaMap中存储一个对象,key值为定义的ThreadLocal,value值为存储的变量,所以并没有共享,可以说是介于全局共享变量和局部变量之间。

Looper对象就是在调用looper.perpare的时候存储在ThreadLocal中,保证一个线程中只有一个looper对象,因为一个线程中只能有一个消息队列。

2、Looper的作用:1、perpare方法创建一个消息队列,同时把looper对象存储到ThreadLoca变量中。2、loop函数使线程进入无限循环,循环取出消息回调到handlemessage中处理,回调后回收调用recycle回收message。

3、MeaasgeQueue的作用:消息队列,先进先出,消息指定了执行时刻的例外。next函数取出消息,如果时间没到则读取下一个。enquenceMeassage添加消息到队列中。实际消息队列是保存在C中,所以这两个方法最终都调用了jni函数调用到了C层。

4、handler的作用:其他线程调用sendmessage发送消息到该线程中,handlemessage处理消息队列取出的消息。所以创建handle对象的线程中必须有messagequeue即必须先调用了looper.perpare且只能调用一次,loop则先调后调都可以,因为loop中虽然用到了handler对象回调handlemeaasge,但是在handler有发送消息之前是不会调用的。

优化:HandlerThread类,对以上关系进行了封装,关键代码:

@Override
    public void run() {
        mTid = Process.myTid();
        Looper.prepare();
        synchronized (this) {
            mLooper = Looper.myLooper();
            notifyAll();
        }
        Process.setThreadPriority(mPriority);
        onLooperPrepared();
        Looper.loop();
        mTid = -1;
    }
该类继承与thread,在run方法中添加了looper创建了消息循环体,然后提供getlooper的方式创建该线程对应的handler。使用方法:必须先调用start创建looper,才能创建对应的handler。



扩展:

Rxjava:

Eventbus:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值