2014-01-24 46 views
0

我使用android服務從手機到服務器每隔5分鐘更新一次數據通過電話網絡。該服務將執行以下操作:如何防止Android異步服務並行運行多次

  1. 服務啓動

  2. 鬧鐘設置爲觸發5分鐘服務開始

  3. 異步數據上傳啓動(這通常需要大約20秒)

  4. selfstop用於關閉服務(請注意,在(2)之後幾乎立即發生,因爲步驟(3)發生在新線程上。

我的問題是這樣的。通常,這一切都可以正常工作,但由於某些原因,異步數據上傳陷入困境,需要超過5分鐘的時間,因此另一項服務開始觸發再次上載IN並行。

我敢肯定,這是一個容易解決的問題 - 我只想知道在service.onStartCommand(..)方法中檢查(即通過某種semiphore或某種東西)的方法,無論上傳從以前發起的服務仍然在運行。如果是,我不會執行上傳。

該過程需要全面保護,因爲如果服務設置了「ISRUNNING」標誌,然後在不重置的情況下退出,則不會發生更多上傳。這不可能發生。需要有失效保護。

謝謝。

+0

請提供您當前正在使用的代碼。所以我們可能會幫你 – virtualpathum

回答

1

爲什麼不設置開始下載到變量中的時間,然後進行下載。

如果花費少於5分鐘,則從下載開始的第5分鐘開始設置下一次(步驟3)。

然後,如果需要超過5分鐘,您可以決定它應該多長時間,也許有立即再次開始下載。

或者,我會做的是反向步驟2和3,並設置下載完成後5分鐘的計時器。

UPDATE:

AsyncTask應僅用於短任務,cYrixmorten提及。 http://chintankhetiya.wordpress.com/2013/05/28/asynctask-android-example-part-1/

所以,如果它可能需要很長時間只使用兩個線程,一個做下載,一到時間下載,如果時間過長,殺死它。

有這是主線程:

class Task implements Runnable { 
    @Override 
    public void run() { 
         // download code here 
     } 
    } 

} 

監控線程:

class MonitorTask implements Runnable { 
    @Override 
    public void run() { 
     for (int i = 0; i <= 10; i++) { 
      final int value = i; 
      try { 
       Thread.sleep(1000 * 30); 
            downloadthread.interrupt(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      bar.setProgress(value); 

     } 
    } 

} 

和主要功能:

// downloadthread is defined at the class level 
downloadthread = new Thread(new Task()).start(); 
new Thread(new MonitorTask()).start(); 

我還沒有試過這種代碼,但像它應該工作。

基本上,只要停止下載線程,如果它需要太長時間,然後重置計時器再試一次。

+0

HI James。如果我等到下載完成重置計時器,那麼如果由於某種原因下載失敗,下一個計時器將永遠不會設置 – WaterBoy

1

一個簡單的解決方案是使用IntentService。

http://developer.android.com/reference/android/app/IntentService.html

的所有請求都在一個工作線程處理的文檔 - 他們可能會在必要時採取長(並不會阻止該應用程序的主循環),但只有一個請求將被處理一次。

因此,上傳永遠不會並行運行。

使用IntentService應該完成異步數據上傳,只是爲了澄清。

+0

我被引導認爲意圖服務不適合長時間操作?我會調查,雖然,謝謝 – WaterBoy

+0

在我看來,這是相當AsyncTask的,它不應該超過10 - 20秒的最大。不要認爲IntentService同樣適用。 Happe編碼 – cYrixmorten

相關問題