Android中需要在主线程中处理UI问题。通过Handler处理消息。
具体说明见示例。
LooperThread.java
class LooperThread extends Thread {
public Handler mHandler;
public TextView tv;
public LooperThread(TextView tv, Handler mHandler) {
this.tv = tv;
this.mHandler = mHandler;
}
@Override
public void run() {
//子线程的looper不是默认开启的,需要先调用prepare()方法
Looper.prepare();
Log.d("zhty", "thread Thread.currentThread().getId():" + Thread.currentThread().getId());
Log.d("zhty", "prepare");
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
//这里会报错
// tv.setText("线程的handler不可以处理UI");
Looper.myLooper().quit();
}
};
Log.d("zhty", "Looper.myLooper():" + Looper.myLooper());
//就是构造时传入的looper
Log.d("zhty", "mHandler.getLooper():" + mHandler.getLooper());
Log.d("zhty", "Looper.getMainLooper():" + Looper.getMainLooper());
//post()的方式.也是封装成message发送到线程的消息队列
mHandler.post(new Runnable() {
@Override
public void run() {
tv.setText("post的方式处理,发送到了消息队列里");
}
});
Log.d("zhty", "loop");
//sendMessage()的方式
new Thread(new Runnable() {
@Override
public void run() {
Log.d("zhty", "thread in thread Thread.currentThread().getId():" + Thread.currentThread().getId());
Message msgMessage = new Message();
mHandler.sendMessage(msgMessage);
}
}).start();
//阻塞的方法,调用quit()方法结束
Looper.loop();
Log.d("zhty", "after loop");
}
}
调用方法:
public void handlerTest() {
final TextView tv = (TextView) findViewById(R.id.tv);
Log.d("zhty", "main Thread.currentThread().getId():" + Thread.currentThread().getId());
//在主线程创建Handler,默认传入的是Looper.getMainLooper
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
tv.setText("主线程的handler可以处理UI");
//主线程的looper不可以执行quit()
// Looper.myLooper().quit();
}
};
new LooperThread(tv, mHandler).start();
}