2014-07-12 137 views
0

这是一个扩展条条实现run()函数的类:为什么Handler.Post阻塞主线程

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放在目标线程的消息队列中,并且线程(不是UI线程)会在可能的时候运行它。 但是这段代码阻止了用户界面。为什么会发生?正如你所看到的,我将目标线程的活套发送给了处理程序的构造函数,处理程序应该使用该活套标识符而不是主线程的活套。

+0

t.getLooper()返回UI Looper,为什么不使用HandlerThread类? – pskink

回答

2

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

为了使这个“工作”,移动myLooper()调用线程run()方法。

+0

感谢哥们。这是一个很好的答案。但我注意到还有另一种方法。如果我在run()函数中初始化处理程序并返回它,而不是返回活套,我可以使用它(处理程序)将runnables发布到目标线程的活套。因为处理程序将线程的活套附加到它上面。但正如你所指出的那样,这是在运行的内部完成这一点所必需的。因为这部分实际上与新线程有关。 – user2808671