2014-07-12 182 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