2011-07-18 69 views
2

該代碼會幫我解釋一下我的問題:隊列可運行在其他線程運行的Android

public class TestHandlerActivity extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    new Thread(){ 
     public void run(){ 
      for (int i=0;i<20;i++){ 
       handler.post(run); 
      } 
     } 
    }.start(); 
} 

Handler handler=new Handler(){ 

}; 

Runnable run = new Runnable(){ 
    public void run(){ 
     try { 
      Thread.sleep(1500); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     Log.d("TAG", "Message processed"); 
    } 
}; 
} 

這樣新的線程,使它們由處理在主線程服務的申請。 我需要做的恰恰相反。 UI線程啓動請求,這些請求由另一個線程按順序提供(順序很重要),並且在每個請求結束時不需要通知UI線程。 一些要點對此很重要:請願書有3個參數(int,int,boolean),他們在數據庫中進行更改,並且由用戶與UI的交互生成,因此不會同時啓動 推進

+0

查看工作線程拉出隊列。您可以使用其中一個併發隊列,例如ConcurrentLinkedQueue。 – Steven

+0

感謝您的快速解答Steven,我是多線程的入門者。我檢查了ConcurrentLinkedQueue,看起來像一個執行while(true){if(queue.pool()!= null)/ *的線程,因此pool * /}有效,但不是CPU最優。你能解釋我怎樣才能改善這一點?謝謝! – Jaimit

回答

2

一種選擇是使用,讓你的主題:http://developer.android.com/reference/android/os/HandlerThread.html

這將創建自己的消息隊列和循環線程。您可以創建一個處理程序,這樣運行的線程上的工作:

HandlerThread handlerThread = new HandlerThread("My Handler"); 
handlerThread.start(); 
Handle myHandler = new Handler(handlerThread.getLooper()); 

這確實需要通過線程完成的所有工作將通過處理程序就可以發送消息和調度的Runnable這樣做。

+0

聽起來不錯,謝謝你的答案。我需要那個處理程序,而我的應用程序是在前臺,我應該調用handlerThread.quit()當它去背景?或不是必需的? – Jaimit

+0

如果你願意,你可以退出它。然而,很多時候,沒有理由不讓它坐在那裏,以便下次用戶返回到應用程序時繼續使用它。 – hackbod

相關問題