当按下后退按钮时,如何在android中停止asynctask?

时间:2016-08-08 18:58:35

标签: java android android-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();
}

2 个答案:

答案 0 :(得分:2)

你无法阻止asynch task instantly。每个AsynchTask都有boolean flag property与之关联,所以如果cancel_flag =True意味着任务被取消且有cancel()可以像这样asynchtask object调用的函数

loginTask.cancel(true);

但所有这个cancel()函数都是这样,它会将asynch任务的取消boolean(flag )属性设置为True,因此,您可以使用isCancelled()函数在{{} doInBackGround内查看此属性1}}并做一些事情,比如

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

如果是True,那么您可以使用break the loops(如果您执行的任务很长)或return快速退出doInBackground并致电cancel() on asynchtask跳过onPostExecute()

的执行

另一个选项是,如果你想在后台停止多个正在运行的异步任务,那么在每个上面调用cancel都会很乏味,所以在这种情况下你可以在container class(of asynchtask)中有一个布尔标志并跳过里面的工作asynchtask如果标志已设置为True,如

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

但请务必在这种情况下检查onpostExecute因为它不会停止执行onpost。

答案 1 :(得分:0)

您可以立即停止拨打asyncTask.cancel(true)

但不建议这样做,因为它可能导致内存泄漏。最好调用asyncTask.cancel(false)并退出doInBackground函数,手动检查isCancelled()值为@Pavneet建议。