为什么Handler.Post阻塞主线程

时间:2014-07-12 20:41:28

标签: android

这是一个扩展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。

1 个答案:

答案 0 :(得分:2)

Looper.myLooper()返回当前线程循环器,它是调用UI线程的looper。然后你用它做一个处理程序并在那里发布一个阻塞运行。

要进行此操作",请在线程myLooper()方法下移动run()调用。