2011-09-23 68 views
2

我想使用HandlerThread類來管理我的應用程序中的線程。以下代碼運行良好:HandlerThread應該重寫run()嗎?

public class ThreadA extends HandlerThread 
{ 
    private void foo() 
    { 
     //do something 
    } 

    private void bar() 
    { 
     //Do something else 
    } 

    @Override 
    public boolean handleMessage(Message msg) { 
     switch(msg.what) 
     { 
      case 1: 
      { 
       this.foo(); 
       break; 
      } 

      case 2: 
      { 
       this.bar(); 
       break; 
      } 
     } 
     return false; 
    } 

    @Override 
    protected void onLooperPrepared() 
    { 
     super.onLooperPrepared(); 
     synchronized (this) { 
      this.AHandler = new Handler(getLooper(),this); 
      notifyAll(); 
     } 
    } 
} 

1-我應該重寫run()方法嗎?在「經典」線程中,大部分代碼位於run方法中。 2 - 讓我想象我需要我的foo()方法是一個無限的過程(例如獲取視頻流)。 什麼是最好的解決方案?

  • 用我的foo()代碼覆蓋運行?
  • 簡單地增加在FOO睡眠(XXX)():

    私人無效美孚(){ // 做一些 睡眠(100); foo(); }

- 使用像一個延遲的消息:

private void foo() 
{ 
    //do something 
    handler.sendEmptyMessageDelayed(1,100); 
} 

PS:的AsyncTask將不包括我的需要,所以也懶得告訴我使用它。

感謝

回答

4

我想你沒有得到的HandlerThread的想法。 HandlerThread旨在實現處理消息的線程。這意味着它在其run()方法中使用Looper.loop()(這就是爲什麼你不應該重寫它)。這反過來意味着你不需要睡在onHandleMessage()爲了防止線程退出,因爲Looper.loop()已經照顧到了這一點。

總結:

  1. 否,不覆蓋的run()。
  2. 你不需要做任何事情來保持線程活着。

如果你想學習/多已瞭解有關HandlerThread,瞭解LooperHandler類。

+0

好的,所以我的第二個問題的最佳解決方案是使用延遲的消息(不想讓線程活着但重複該方法)? – grunk

0

您不應該重寫HandlerThread中的run方法,因爲那是實際發生該類的核心功能的地方。根據你展示的內容,我也沒有理由這麼做。

如果你的任務本身是無限的,沒有任何東西阻止你以這種方式執行它。您可能想要使用handler.sendEmptyMessageDelayed的唯一原因是,如果您計劃在執行foo()時讓其他任務在HandlerThread上排隊。您推薦的另一種方法將阻止HandlerThread處理任何其他消息。話雖如此,我懷疑有一個更好的方法可以讓你的任務無限。最後,你應該記住停止你的無限任務並且調用HandlerThread.getLooper()。quit()來確保你的HandlerThread很好地停止。

相關問題