2013-08-07 3 views
0

У меня есть AsyncTask, как показано ниже:Как отменить AsyncTask на Android

private class SearchTask extends AsyncTask<Object, Object, Object> { 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     System.out.println("Start"); 
    } 

    @Override 
    protected Object doInBackground(Object... urls) { 
     SearchFunction(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Object result) { 
     System.out.println("End"); 
    } 
} 

и таймер, как показано ниже:

private Handler handler = new Handler(); 
private Runnable updateTimer = new Runnable() { 
    public void run() { 
     System.out.println("===status==="); 
     System.out.println(SearchTask.getStatus()); 

     SearchTask.cancel(true); 
    handler.postDelayed(updateTimer, 3000); 
    } 
}; 

Позвони AsyncTask и код таймера, как показано ниже:

  handler.postDelayed(updateTimer, 3000); 
      SearchTask SearchTask = new SearchTask(); 
      SearchTask.execute(); 

Метод SearchFunction в doInBackground может потратить более 3 секунд, поэтому добавьте таймер.
Но в updateTimer первый вызов и отмена AsyncTask, doInBackground все еще работает до его завершения, а затем отменяет onPostExecute.
Как я могу сделать, чтобы отменить doInBackground прямо?

+0

http://stackoverflow.com/questions/16538714/stop-asynctask-doinbackground-method/16538887. проверьте это – Raghunandan

+0

u означает сказать, что вам нужно отменить асинтазу через 3 секунды? – Sri

+1

изменить имя объекта SearchTask ... Я поразился, что ваш редактор разрешает одно и то же имя класса для объекта с тем же случаем. –

ответ

2

Просто проверьте isCancelled() один раз в то время и попробовать его:

protected Object doInBackground(Object... x) { 
    while (/* condition */) { 
     // work... 
     if (isCancelled()) break; 
    } 
    return null; 
} 
+0

пример отмены асинтезы http://www.quicktips.in/correct-way- к отмене-ан-AsyncTask-в-андроида / –

1

В принципе, вы не можете этого сделать. Самое лучшее, когда вы устанавливаете cancel(true), означает, что вы проигнорируете код, запущенный на onPostExecute() (может быть, там есть заявление if). Надеюсь это поможет.