这是一个扩展Thread并实现run()函数的类:
public class TestThread extends Thread{
public Handler handler;
public TestThread(){
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
}
};
}
public Looper getLooper(){
return Looper.myLooper();
}
@Override
public void run() {
// TODO Auto-generated method stub
Looper.prepare();
Looper.loop();
}
}
现在,在主要活动的按钮中,我有以下代码:
TestThread t=new TestThread();
t.start();
Handler h=new Handler(t.getLooper());
h.post(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
while (true);
}
});
据我所知,这应该将runnable放在目标Thread的消息队列中,并且线程(不是UI线程)将在可能的情况下运行它。 但是这段代码阻止了用户界面。为什么会这样?如你所见,我将目标线程的looper发送给Handler构造函数,处理程序应该使用该looper而不是主线程的looper。
答案 0 :(得分:2)
Looper.myLooper()
返回当前线程循环器,它是调用UI线程的looper。然后你用它做一个处理程序并在那里发布一个阻塞运行。
要进行此操作",请在线程myLooper()
方法下移动run()
调用。