1

我正在創建一個應用程序,在那裏我需要處理可能很大並且可能需要一些時間的數據。中斷IntentService

現在我讀了很多關於IntentService的內容,實際上我已經實現了它作爲處理REST調用的通信類,但現在我試圖將它用於長時間運行的數據處理。

我在標題欄中添加了一個進度指示器,但現在id可以在用戶點擊它時取消操作。

是否有這樣做的一些優雅的方式?(有點像了Thread.interrupt())目前,我有一個靜態布爾「運行」,我已經重寫了onStartCommand到

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    if (intent.getAction() != null && intent.getAction().equals("stop")) { 
     running = false; 
    } 
    onStart(intent, startId); 
    return START_NOT_STICKY; 
} 

我覺得這比較麻煩和不夠優雅,並認爲我可能濫用IntentService來實現其無意的功能。有沒有更好的方法來做到這一點?

stopSelf()不適用於我,因爲我需要中斷正在進行的操作。我試了一下,代碼剛剛執行。

我想到的AsyncTask的,但即時通訊擔心任務不會生存下來。(操作可以採取儘可能15分鐘)

+0

爲避免AsyncTasks這樣做是正確的:從[documentation](https://developer.android.com/reference/android/)中,「AsyncTasks理想地應該用於短操作(最多幾秒鐘) os/AsyncTask.html) – Sam 2013-03-14 15:32:31

回答

2

我認爲IntentService是不是真的適合你的目的。相反,您可以在特定的啓動命令上直接擴展Servicehttp://developer.android.com/guide/components/services.html#ExtendingService)並清除消息隊列(在這種情況下爲Handler),並執行完成過程。

+0

創建我自己的服務似乎有點矯枉過正。我真的不想要parralel執行(實際上它會導致問題)。但它似乎是唯一的乾淨方式。 – Radovan 2013-03-14 17:06:12

+1

@Radovan我不是在談論並行執行 - 你可以自由地實現與IntentService相同的任務隊列。只需根據您的需求進行定製 – 2013-03-14 17:12:03

2

我爲這種情況提出的一個簡單的解決方案是添加一個字段,後臺線程(即IntentService爲您旋轉)代碼檢查,並在onDestory()中設置,這將在您執行時調用您的IntentService類上的stopService()調用。

所以在您的IntentService:

@Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.d(LOGTAG, "got on destroy, asking background thread to stop as well"); 
     mPleaseStop = true; 
    } 

@Override 
protected void onHandleIntent(Intent intent) { 
    while(true) { 
     Log.d(LOGTAG, "Doing some long running stuff here"); 
     if (mPleaseStop) { 
      return; 
     } 
    } 
} 

然後就叫

stopService(new Intent(this, MyIntentService.class)) 

而且是正確的,你應該做的設置和檢查同步了。