2012-09-16 68 views
3

我有一個消息Looper線程的一些位置計算。 爲此,我呼籲:我可以得到一個無阻塞的Looper嗎?

LocationManager.requestLocationUpdates(mProvider, mMinTime, mMinDistance, (LocationListener)this, looper); 

獲得有效的Looper對象我準備我的主題是這樣的:

Looper.prepare(); 
    mLooper = Looper.myLooper(); 
    handler = [...] 
    Looper.loop(); 

不過是它在某種程度上可能有額外的while循環用於數據處理在同一個線程?

也許我可以以某種方式派生我自己的Looper並手動處理這些消息,但是如何?

回答

0

沒有必要這樣的事情。

當你調用Looper.loop()時,線程運行它的處理程序的消息隊列。因此,Handler收到的任何消息或帖子都將在Looper線程上處理。

像這樣:

Thread t1 = new Thread(new Runnable() 
{ 
    @Override 
    public void run() { 

    Looper.prepare(); 

    final Handler h = new Handler(); 
     final boolean isRunning = true; 

     Thread t2 = new Thread(new Runnable() { 

      @Override 
      public void run() 
      { 
       //Do stuff like download 


       h.post(new Runnable() { 

        @Override 
        public void run() { 

         //Post stuff to Thread t1 

        } 
       }); 

       isRunning = false; 
       h.getLooper().quit(); 
      } 
     } 

    while(isRunning) 
    { 
      //This will ensure that the messages sent by the Handler, be called inside the Thread 
    Looper.loop(); 
    } 
    } 
} 

這樣可以確保一個線程一直運行到該處理器的職位和回調響應所需的時間。你也可以用你自己的handleMessage方法來擴展Handler,並且它們也會在Thread t1中被調用。

希望它有幫助。

+1

Q1:你如何設置最終布爾isRunning爲false? Q2:如何在封閉類型中定義最終布爾值isRunning? Q3:你如何在不啓動線程的情況下使用線程? 問題4:如何處理線程t1中的消息並更新線程t2中的變量:例如處理程序接收到「停止運行」消息 ,該消息在handleMessage方法中處理,並在線程t2中處於無限循環 - while(!stopped) - 通過將線程t2的停止布爾值設置爲false來停止; ??我無法得到它的工作:( – user504342

相關問題