Я использую асинхронную библиотеку http android loopj для реализации службы загрузки файлов. Она имеет следующие упрощенную реализациюОтменить запрос AsyncHttpClient во время выполнения задачи в службе
class MyService extends IntentService {
private CompletionService<NoResultType> mEcs;
private ExecutorService mExec;
private final int THREADS_NUM = 5;
private final AsyncHttpClient aClient = new AsyncHttpClient();
public interface UploadListener{
void uploadFailed(final int position, int errorCode);
void didUpload(final int position);
}
UploadListener myUploadListener;
MyService(){
// Init CompletionService and ExecutorService is here
mExec = Executors.newFixedThreadPool(THREADS_NUM);
mEcs = new ExecutorCompletionService<NoResultType>(mExec);
}
myUploadListener = new UploadListener{
void uploadFailed(final int position, int errorCode){
if(isCriticalError(errorCode)){
aClient.cancelRequests(getApplicationContext(),true); // Cancel Upload process
mExec.shutdownNow(); // Stop Execution of upload tasks
}
}
} // myUploadListener
protected void onHandleIntent(Intent intent) {
// Init tasks here
ArrayList<File> fileList = gerFileList()
ArrayList<UploadTask> tasks = new List
for (File file : fileList) {
UploadTask yt1 = new UploadTask(file.getId(), file);
tasks.add(yt1);
}
for (UploadTask t : tasks) {
mEcs.submit(t); // Start Task
}
} // onHandleIntent
class UploadTask implements Callable<NoResultType> {
public UploadTask(int position, MFile file) {
mPosition = position;
mFile = file;
}
@Override
public NoResultType call() throws Exception {
aClient.post(getApplicationContext(),url,params,new AsyncHttpResponseHandler{
public void onFailure(Throwable e, String response) {
myUploadListener.uploadFailed(mPosition, getCode(response));
}
}); // aClient.post
} // call()
} // UploadTask
} // MyService
Логика реализации этого проста: Всякий раз, когда произойдет сбой из-за фатальной ошибки немедленно отменить выполнение других задач Upload. Проблема заключается в том, что он завершает выполнение задач, но не завершает загрузку файла в задание, которое было запущено. Например, Загрузить задачу Starts => aClient.post(file)
. Задание загрузки отменено. но процесс загрузки aClient.post(file)
остается, несмотря на звонки aClient.cancelRequests(getApplicationContext(),true);
Любые идеи? Спасибо.