2016-08-08 2 views
1

Я запускаю AsyncTask и занимает немного времени для загрузки. В этот период времени, если я нажимаю кнопку «Назад», он не отвечает. Он реагирует только через несколько секунд. Итак, как я могу убить или приостановить или переопределить AsyncTask, чтобы вернуться? Или есть ли другой способ сделать что-то подобное?Как остановить asynctask в андроиде при нажатии кнопки «Назад»?

if (mainContent != null) { 
    mainContent.post(new Runnable() { 
     @Override 
     public void run() { 
      Bitmap bmp = Utilities.getBitmapFromView(mainContent); 
      BlurFilter blurFilter = new BlurFilter(); 
      Bitmap blurredBitmap = blurFilter.fastblur(bmp,1,65); 
      asyncTask = new ConvertViews(blurredBitmap); 
      asyncTask.execute(); 
     } 
    }); 

Мои AsyncTask:

class ConvertViews extends AsyncTask<Void,Void,Void> { 
     private Bitmap bmp; 

     public ConvertViews(Bitmap bmp){ 
      this.bmp = bmp; 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       //Thread.sleep(200); 
       if(mainViewDrawable == null) { 
        mainViewDrawable = new BitmapDrawable(getResources(), bmp); 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 
    } 

Мои onBackPressed():

public void onBackPressed() { 
    super.onBackPressed(); 
    asyncTask.cancel(true); 
    finish(); 
} 
+0

Оставьте свой код? –

+0

Я новичок в этой платформе. Можете ли вы сказать мне, как я могу опубликовать код? Во время публикации отображается ошибка. –

+0

Скопируйте и вставьте код в поле редактирования, выберите весь свой код в поле редактирования и нажмите Ctrl + K, чтобы отформатировать его. Затем отправьте его. –

ответ

2

нет никакого способа, что вы можете остановить asynch task instantly .every AsynchTask имеет boolean flag property, связанные с ним, так что если cancel_flag =True среднее задача была отменена, и есть функция cancel(), которую можно вызвать на 01 Функциякак этого

loginTask.cancel(true);

, но все эти отменить() не является, он установит отменить boolean(flag) свойства асинхронной задачи True так, вы можете проверить это свойство с isCancelled() функции внутри doInBackGround и сделать что-то, как

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

и если это правда, то вы можете использовать break the loops (если вы делаете длинную задачу) или return быстро выйти из doInBackground и вызова cancel() on asynchtask пропустит выполнение onPostExecute().

и другой вариант, если вы хотите остановить несколько запущенных задач asynch в фоновом режиме, тогда вызов отмены на каждом из них может быть утомительным, поэтому в этом случае вы можете иметь логический флаг в container class(of asynchtask) и пропустить рабочую внутреннюю асинхронную операцию, если флаг был установлен Правда, как

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

, но не забудьте также поставить галочку в onpostExecute в этом случае, потому что это не остановит выполнение onpost.

0

Вы можете немедленно его остановить, указав asyncTask.cancel(true).

Но это не рекомендуется делать, поскольку это может привести к утечке памяти. Лучше позвонить asyncTask.cancel(false) и выйти из функции doInBackground вручную проверить значение isCancelled() как @Pavneet.

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