2014-01-21 2 views
0

У меня есть AsyncTask с полем «sardine», в doInBackground() Я вызываю sardine.put (...), который выполняет сетевые операции и запускает синхронизацию. Теперь, когда это выполняется, мне нужно иметь возможность вызвать sardine.abort() в общедоступном методе AsyncTask. Я читал, что я должен делать синхронизированный блок на (это), но я не уверен, что из последствий этого, теперь я делаю следующее:Синхронизировано в 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

Вы должны просто вызвать метод отмены задачи async, что должно привести к тому, что сардин получит прерывистое исключение, которое вы можете обработать. Для этого вам не нужен фоновый поток. Но было бы лучше, если бы вы предоставили более подробную информацию об этом методе «сардин» и «прервать». –

+0

sardine - это библиотека, используемая для создания WebDav Request and abort, прерывает соединение. Вызов отмены не работает, потому что один раз в doInBackground Задача не отменяется, отмена только позволяет избежать запуска задачи или, если она уже запущена, то onPostExceute не вызывается – David

Смежные вопросы