2012-02-08 44 views
2

我有一個應用程序連接到Web服務來檢索數據。我使用AsyncTask來做到這一點。 以下是一段代碼,我使用doInBackground:Android Java AsyncTask isCancelled問題

publishProgress(user.dbsCode() + ": Retrieving Standard Comments"); 
if (!_sync.isCancelled()) { 
    result = _dbFiller.fillStandardCommentsTable(); 
} else { 
    return null; 
} 

當我測試這在我的模擬器,所以它似乎很好地工作。 isCancelled被設置爲& onCancelled()被調用。當我測試使用我的Galaxy Tablet(運行3.2 ...我的項目是使用2.2創建的)時,如果isCancelled被設置,它會被擊中或錯過。

此過程可能需要一段時間,具體取決於特定用戶下載的數據量。我做的第一件事是爲用戶下載一份(我們稱之爲「作業」)的清單。然後我會調用單獨的Web服務來下載「作業」的不同部分。每一步都包含上述代碼,我正在檢查我的同步任務是否被取消。我真的迷失了。任何有用的意見表示讚賞。即使只是一個方向。我已經對AsyncTasks做了如此多的瞭解,我的腦袋正在旋轉。

回答

0

在什麼情況下取消下載?

由於您無法真正控制調度程序,因此您的任務可能會在您能夠取消它們之前完成運行。由於真正的硬件可能比你的模擬器更快,這似乎是可能的。

如果我記得,取消已經完成的AsyncTask沒有任何作用。你確定你的任務不完整嗎?

+0

我實際上是從這一個任務調用多個Web服務。在給每個人打電話之前,我會檢查任務是否被取消。出於某種原因,模擬器將在Web服務調用過程中取消。在設置「isCancelled」之前,平板電腦將完成呼叫。仍然不確定爲什麼一個工作不同於另一個工作。要解決這個問題,我只需要拋出另一個對話框,顯示「正在完成當前操作」,直到isCancelled標誌被設置。 – Chris 2012-02-10 21:14:08

+0

@Chris我仍然不確定你的問題到底是什麼。如果'AsyncTask'在測試之前完成,看它是否被取消(可能來自'doInBackground()'內),那麼它就完成了。操作系統不會在中途調用中打斷您的代碼。這就是爲什麼你有長時間運行的代碼需要調用isCancelled()來知道它是否應該繼續。取消發生在'AsyncTask'線程之外,所以你不能對事情發生的順序做任何假設。 – Argyle 2012-02-10 21:33:49

+0

好吧,讓我們說我有一個Web服務,返回一個300條記錄,我將插入到數組列表。我有一個方法可以啓動一系列事件(用於調用Web服務,解析XML,填充列表等等,全部在不同的類中)。通過我的測試,如果我取消了異步,然後檢查我的ArrayList的大小,我將得到一個介於1和300之間的隨機數。如果我在平板電腦上取消,則列表將繼續填充,直到所有記錄都插入ArrayList 。我得到了一個朋友電話(運行2.3),並在手機上獲得了與我模擬器相同的結果。 – Chris 2012-02-10 23:42:09