class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
单向的消息触发模型.
每个线程可以对应一个消息循环队列Looper.消息循环队列Looper提供一个句柄Handler, 其他线程获得该Looper的句柄Handler可以将消息发给该消息循环队列Looper.
可以通过重写handleMessage对消息进行处理.
Looper.prepare()是创建消息循环队列
Looper.loop()是启动该消息循环队列.Looper.loop()相当于一个循环,没有消息时将会等待,有消息则进行处理.
所以Looper.loop()后的代码是没法执行的.
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
//could not run this code
Log.v("test", "hello");
}
}
只有在Looper结束后会执行Looper.loop()后的代码.你可以在handleMessage中调用Looper.quit().像下面这样.
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
Looper.myLooper().quit();
//or this.getLooper().quit();
}
};
Looper.loop();
//could not run this code
Log.v("test", "hello");
}
}
注意Activity结束或者被覆盖时要根据应用的逻辑将相应的线程退出,显然Looper对应的线程一直在等待和处理消息.
那么一定要调用Looper.quit().
但是一般不像上面那样结束Looper,在别的线程,一般是主控线程或逻辑控制线程,可以通过Looper的句柄handler来处理.
调用mHandler.getLooper().quit()即可.
android的主线程默认是有消息循环队列的.因此不需要调用Looper.prepare().
public class TestActivity extends Activity
public Handler m_handler;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//don't need to call Looper.prepare()
m_handler = new Handler(){
public void handlMessage(Message msg){
//handle msg here
}
};
//neither Looper.loop()
}
}