2011-11-03 82 views
1

我正在加載一組要下載的文件,並且我爲這些文件中的每一個啓動了一個IntentService。問題在於Internet連接問題,如設備斷開連接,我將不得不清除或停止IntentService的隊列處理。停止/清除互聯網關閉時的IntentService隊列?

在我的代碼有一個while循環中的文件被下載。其中的這個循環運行的條件是:檢查Internet連接,我已經用下面的代碼完成:

public boolean isOnline() { 
     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     if(cm != null){ 
      return cm.getActiveNetworkInfo().isConnectedOrConnecting(); 
     } 
     return false; 


} 

我的循環類同於以下內容:

while(.. , isOnline()){ 
    /// Download file 
} 

如果我現在正在隊列中下載一個文件,如果互聯網停止運行,循環將不再運行,並且該文件的IntentService將停止,但現在如果互聯網返回,下載將從隊列中的下一個文件開始,忽略最後一個文件我們無法下載。如何清除IntentService隊列或使IntentService隊列從其離開的位置恢復下載。

回答

1

如何清除IntentService隊列或使IntentService隊列從其離開的位置恢復下載。

你真的不能做任何,據我所知。 IntentService使用的隊列不會暴露給開發人員。

在這種情況下,創建自己的隊列(例如,LinkedBlockingQueue),您自己的線程監視隊列以及您自己的Service包裝所有這些(並處理一旦隊列清空,你可以撥打stopSelf()並退出後臺線程)。

或者,通過IntentService通知某些事件(例如,通過Messenger)關於失敗的下載,因此您可以在Internet訪問返回後的某個時間排隊該文件。

+0

感謝您的回答。你可以給我一個鏈接到IntentService在Android平臺上的實現,因爲我似乎無法在任何地方找到它! – bytebiscuit

+0

http://www.google.com/codesearch#cZwlSNS7aEw/frameworks/base/core/java/android/app/IntentService.java – CommonsWare

+0

所以我打算在這裏,這LinkedBlockQueue將包含線程和這個隊列將被控制一個'最高'的線程,所有這些都包含在服務類中。所以現在如果我有10個文件,我需要啓動存儲在這個隊列中的10個線程,並且控制是最高線程將按順序運行。如果一個線程檢測到互聯網關閉,最高線程將被通知,並且最高線程將使用SharedPreferences記錄下載的文件並自行終止並清除隊列。 – bytebiscuit