2011-04-07 467 views
2

我有一個可能很簡單的問題。我有一個Android服務;在那裏我創建了一個通用服務類,它請求鎖並在單獨的線程中執行實際(擴展)的服務代碼。示例如下:爲什麼Android服務需要在UI線程上運行?

abstract public class ParentService extends Service { 


public static void getLocks(Context context) { 
     //code to get locks 
} 

public abstract void doServiceJob(); 

@Override 
public void onCreate() { 
    super.onCreate();  
    //Run the service code in separate thread 
    Thread serviceThread = new Thread() { 
     public void run() { 
      //Looper.prepare(); 
      doServiceJob(); 
      //Looper.loop(); 
     } 
    }; 
    serviceThread.start(); 
} 

@Override 
public void onDestroy() { 
     //release locks 
} 
} 

在上例中,即使Looper.prepare()和Looper.loop()未在調用線程中調用,一切正常。

但是,如果我試圖通過GPS或者網絡獲得位置;那麼我有一個問題,代碼不會運行,說「不能創建處理程序內部沒有調用Looper.prepare()」的線程。

我明白,我們需要創建尺蠖和處理程序傳達給UI線程;針對影響用戶界面的事件。但是,獲取位置會影響UI嗎?是否因爲位置提供商也會嘗試在我的手機頂欄上繪製GPS圖標,並且因爲它不在UI線程中運行;它不能那樣做?

問題是什麼在這裏,我可以通過調用looper.prepare()和Looper.loop()解決這一問題;但是我需要了解以下事情?

  • 我知道服務在主線程上運行,這與UI線程相同;這是否意味着服務有能力改變用戶界面,我們不這樣做,因爲它不是很好的用戶體驗,這就是爲什麼通過通知進行溝通的原因。 (即使通知需要在UI線程上運行?)
  • 爲什麼位置提供商需要在UI線程上運行?
  • 我不是在這裏宣佈任何處理,我打電話一looper.prepare();那麼消息隊列如何在後臺工作,以及在android代碼下面發生了什麼?

任何指針和這些問題的答案將是很有益的。在此先感謝您的幫助。

乾杯

+0

將應用的服務和活動放在同一個線程上的決定可能是爲了簡化事情並降低MT成本。只是我的猜測:)。內核必須處理的線程少,沒有併發問題。 – seand 2011-04-07 04:17:18

回答

1

你爲什麼要打電話Looper.Loop的是,它提供了通過後臺操作的前臺線程上執行代碼的路線的原因。來自後臺線程的消息使用Handler對象發佈到UI線程上,而這些又要求UI線程調用Looper.Loop來獲取服務的實際消息。這就是消息處理髮生的地方:在Looper.Loop調用中。

相關問題