2014-01-21 64 views
0

我在doInBackground()中有一個名爲「sardine」的字段的AsyncTask,我調用sardine.put(...),它使網絡操作和運行同步。現在,在運行時,我需要能夠在AsyncTask的公共方法中調用sardine.abort()。我讀了我應該做的(這)一個synchronized塊,但我不知道的這樣的後果,我現在做如下:在AsyncTask中同步

public class AsyncWebDavUploadFile extends AsyncTask<Void, Long, Integer> { 

private SardinePatched sardine;  

@Override 
protected Integer doInBackground(final Void... params) { 
    ... 
    sardine = new Sardine... 
    sardine.put(urlString, fileInputStream, mimeType, file.length(), true); 
    ...  
    return result; 

} 

public void stopUplaod() { 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      if (sardine != null) { 
       synchronized (sardine) { 
        sardine.abort(); 
       } 
      } 
     } 
    }).start(); 
} 

... 

}

「sardine.put」做的「 AbstractHttpClient.execute「和sardine.abort做了一個HttpRequestBase.abort,但我不認爲這個問題。

回答

2

使用AsyncTaskLoader和LoaderManager。然後你可以調用Loader.cancelLoad。

http://developer.android.com/reference/android/content/AsyncTaskLoader.html

如果你不想比,然後使用取消(真)上的AsyncTask將中斷它做。您不需要任何同步塊或任何新線程。在後臺方法中處理被中斷的異常。

+0

它可能工作,但我想知道使用AsyncTask的解決方案 – David

+0

您應該能夠調用異步任務的取消方法,這應該導致沙丁魚得到一個可以處理的中斷異常。你不需要後臺線程來做到這一點。但是如果你提供了關於這個「沙丁魚」和「中止」方法的更多細節,會更好。 –

+0

沙丁魚是用於製作WebDav請求並中止連接的庫。調用取消不起作用,因爲一旦在doInBackground中任務沒有被取消,取消只會避免任務啓動,或者如果已經開始,則不調用onPostExceute – David