android的消息机制总结2

android怎样在非主线程中实现消息循环

有两种方法:

一. 自己用代码实现:新启动一个Thread,在run方法中调用如下代码即可

...
Looper.prepare();
...
Looper mLooper=Looper.myLooper();    
...
Looper.loop();
...

Looper mLooper=Looper.myLooper();的意义在于其他线程可以通过mLooper对象构造Handler对象从而向此线程发送消息.并且可以在其他线程中调用mLooper.quit()或者mLooper.quitSafely()优雅地退出消息循环.

注意:要等到调用Looper对象的quit或者quitSafely方法之后才会执行loop方法后面的代码.

二. 使用HandlerThread(HandlerThread是上一个方法的完善版本,考虑了线程同步等问题,使用起来比较方便),使用代码如下

HandlerThread myHandlerThread =new HandlerThread("ThreadName");
myHandlerThread.start();

之后就可以调用myHandlerThread.getLooper得到Looper对象进而构造Handler对象愉快地向此线程发送消息了.
如果想要监听HandlerThread的Looper对象构造成功的消息,可以继承此类:

public class MyHandlerThread extends HandlerThread{
    @Override
    protected void onLooperPrepared() {
    //do something
    //此时线程的Looper对象已经存在了,此方法就在即将进入loop的线程中调用.
    }
}

几个有意思的方法

  • Looper对象的setMessageLogging方法,可以打印出Looper处理消息的过程

  • Looper类的getMainLooper方法,可以获取此进程中的主线程的Looper,因此可以通过Looper.myLooper() == Looper.getMainLooper() 判断当前线程是否是主线程

  • Looper类的myLooper方法,可以获取当前线程的Looper对象,如果当前线程没有Looper,则返回null

  • Looper类的myQueue方法,可以获取当前线程的MessageQueue对象,如果当前线程没有Looper,则会抛出空指针异常

  • MessageQueue的addIdleHandler和removeIdleHandler方法可以让线程空闲时执行一些代码

知识点

快速地发送消息可以采用Handler对象的obtainMessage或者Message类的obtain方法得到Message对象并设置其成员后直接调用其sendToTarget方法.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值