2014-12-04 43 views
1

我需要一個無限期工作的後臺線程。我已經寫了這個代碼來定義一個IntentService:無限期地在後臺工作

public class RecordInternetUsageService extends IntentService { 

public RecordInternetUsageService() { 
    super("test"); 
    // TODO Auto-generated constructor stub 
} 

@Override 
protected void onHandleIntent(Intent intent) { 

    synchronized (this) { 
     try { 
      wait(1000); 

     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    Toast.makeText(this, "test", Toast.LENGTH_LONG).show(); 
} 

}

我有兩個問題,它是一個合適的類在做背景的作品無限期?
爲什麼當我想通過wait()方法來使用此線程時,會拋出下面提到的異常嗎?
「將消息發送給死線程上的處理程序」。
我該如何解決這個問題?

回答

3

即使您的應用程序已關閉,即在後臺使用服務......但您可以在服務的主線程上執行長時間的處理工作,否則您會得到ANR(android not responding),從而執行長時間處理任務。所以你必須做一個後臺線程,並提交所有任務在該後臺線程(這是由句柄類完成),並處理所有提交和響應的東西......來包裝這種設計模式IntenServcie類提供。

IntentService類在作業提交時和作業完成時自動調用該線程,殺死該sevrice並釋放內存。意圖服務一旦完成工作就退出。

這裏的問題是,您正在由IntentService管理的線程內部創建Toast。系統將使用與該線程關聯的Handler來顯示和隱藏Toast。

第一次吐司將被正確顯示,但是當系統試圖隱藏它時,在onHandleIntent方法結束後,錯誤「發送消息給死的線程上的Handler」將被拋出,因爲線程在吐司創建不再有效。