2015-08-06 3 views
0

Я использую асинхронную библиотеку 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);

Любые идеи? Спасибо.

ответ

1

После прибегая к помощи некоторое время я придумал фиктивного решения битном: Для того, чтобы закрыть вниз обработать запрос просто позвоните

// aClient is an instance of AsyncHttpClient(SyncHttpClient) 
    aClient.getHttpClient().getConnectionManager().shutdown(); 

он работает как шарм :)

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