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方法.