2015-12-24 2 views
0

У меня есть класс AsyncTask в андроиде, который я использую для всех видов запросов с сервера - , чтобы указать, что мои запросы не работают параллельно, каждый запрос загружает данные к активности и после загрузки данных -> пользователь может перейти к другому действию, которое отправляет другой запрос.android - AsyncTask отменяется по какой-то причине

У меня также есть TaskCanceler, который несет ответственность за отменить в AsyncTask, если он занимает более 8 секунд.

Проблема -

По какой-то причине, когда я открываю приложение и просматривать между ними, позволяет сказать, 5-6 деятельности, может быть меньше или больше, (каждая активность отправляет запрос на сервер -> ожидает ответа -> заполняет активность данными), в какой-то момент я перехожу к Activity и начинает загружать данные, а затем примерно через 1 секунду, я вижу OnCancelled() Сообщение об ошибке ("no connection to server!").

Это означает, что OnCancelled() был назван - и TaskCenceler следует назвать только после 8 секунд!.

Я проверил, и сервер отвечает на все запросы - но приложение для Android просто «не ждет» для одного из запросов из ниоткуда.

Почему это происходит? это не специфично для Activity, каждый раз, когда это происходит на другом. почему внезапно TaskCenceler не дожидается до 8 секунд?

Мои AsyncTask:

private class executeRequest extends AsyncTask<HttpRequest, Void, Integer> { 

    private ResponseListener listener; 

    public executeRequest(ResponseListener responseListener) { 
     listener = responseListener; 
     // Listener in the Activity to respond to Error/Success 
    } 

    @Override 
    protected void onCancelled() { 
     handleCancelled(); 
     // if more than 8 seconds passed 
    } 

    private void handleCancelled() { 
     if (taskCanceler != null && handler != null) { 
      handler.removeCallbacks(taskCanceler); 
     } 
     listener.onError("no connection to server!"); 
    } 

    @Override 
    protected Integer doInBackground(HttpRequest... params) { 
     // TODO Auto-generated method stub 
     HttpRequest request = params[0]; 
     int responseCode = -1; 
     HttpResponse response; 
     responseResult = ""; 
     response = httpClient.execute((HttpUriRequest) request); 
     responseCode = response.getStatusLine().getStatusCode(); 
     responseResult = EntityUtils.toString(response.getEntity(), 
        HTTP.UTF_8); 
     return responseCode; 
    } 

    @Override 
    protected void onPostExecute(Integer result) { 
      // handle response 
    } 
} 

TaskCanceller:

public class TaskCanceler implements Runnable { 
    public executeRequest task; 

    public TaskCanceler() { 
    } 

    public void setTask(executeRequest task) { 
     this.task = task; 
    } 

    @Override 
    public void run() { 
     if (task != null) 
      if (task.getStatus() == AsyncTask.Status.RUNNING) { 
       task.onCancelled(); 
      } 
    } 
} 

Это, как я начинаю все мои задачи:

// Setting up the Handler and the TaskCanceler 
private Handler handler = new Handler(); 
private TaskCanceler taskCanceler = new TaskCanceler(); 

task = new executeRequest(responseListener, type); 
taskCanceler.setTask(task); 
handler.postDelayed(taskCanceler, 8 * 1000); // cancel after 8 seconds 
task.execute(refuseJoinRide); 

Любые идеи?

Любая помощь будет оценена!

ответ

0

Возможно, журнал, который вы получаете, на самом деле не из задачи, которую вы недавно начали. Это может быть из другой деятельности, которую вы начали раньше.

+0

Вы должны также использовать AsyncTask # cancel (boolean) вместо onCancelled() при отмене своей задачи. –

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