2013-01-17 80 views
2

取消AsyncTasks比方說,我有TasksManager具有靜態列表的任務(不知道名單是很好的解決方案),並有靜態方法addTaskToList(MyTask task){tasks.add(task);}, removeTaskFromList(MyTask task){tasks.remove(task);} 在doInBackground(每個任務)調用第一種方法,並在onPostExecute()有第二方法調用「this」。 MyTask有字符串字段「方法」。從收集

我想取消這個列表,task.getMethod()。包含(「URL」)的任務.. 不知道這個代碼是夠用了穩定的工作..看起來像任務的onCancelled()不總是叫,多線程對於我認爲的這種方法可能是危險的。

for (MyTask task : tasks) { 
     if (task.getMethod().contains("url")) { 
      task.cancel(true); 
      break; 
     } 
    } 

是正常的做法來存儲任務,這樣也可以建議我更優雅?

回答

0

取消的AsyncTask並不總是立刻/顯而易見的事情。如果你正在使用cancel,你還需要確保doInBackground意識到isCancelled,你必須停止你正在做自己(請參閱該文檔爲isCancelled)。

但我不推薦存儲AsyncTask對象的列表並遍歷他們做連續的後臺工作呢。聽起來好像很快就會變得非常混亂。每個AsyncTask創建一個新的Thread,這聽起來不像你想要的。相反,你可能只需要一個後臺線程,你可以做的東西?

對於一個後臺線程,你可以使用一個HandlerThread和你自己的活套,具體如下:

HandlerThread backThread = new HandlerThread("BackLooper", Thread.NORM_PRIORITY); 
backThread.start(); 
Looper backLooper = backThread.getLooper(); 

private synchronized void runOnBackThread(Runnable r) { 
    new Handler(backLooper).post(r); 
} 

然後要依次您可以通過提交Runnable張貼回線程上運行的每個項目。而且,您還可以使用其他Handler發佈變體,postDelayed,postAt等。

而且,根據你在做什麼,你可能會發現IntentService非常有用有幫助。 IntentService專門爲「工作隊列」類型模式提供。它有一個後臺線程,當你調用它的時候,你會告訴它做一次,並且當它不需要的時候自己離開。

最後,如果你正在尋找一個非常好的一般的「任務」的類型庫爲Android檢查了廣場的Tape。這與您的問題沒有直接關係,但是我發現Tape具有更強大的「排隊」任務類型情況。

+1

我知道取消不是直接的事情,我的主要目標不是從任務返回最終結果。一個後臺線程是一個壞主意,有時最多有20個具有不同「方法」字段的相同的asynctasks。 –

+0

所以我沒有看到任何其他的變種,除了存儲和迭代他們,但它是非常混亂,不工作.. –

+0

「一個後臺線程是一個壞主意,」,哈,好的,但你會有一個糟糕的時間。 –