如何在android中停止(杀死)异步任务

如何在android中停止(杀死)异步任务,android,gridview,asynchronous,Android,Gridview,Asynchronous,嗨,我是android新手: 我正在GridView中显示图像拇指。为了获得更好的性能,我正在异步加载它 我的任务如下: class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { private final WeakReference<ImageView> imageViewReference; private int data = 0; privat

嗨,我是android新手:

我正在GridView中显示图像拇指。为了获得更好的性能,我正在异步加载它

我的任务如下:

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
        private final WeakReference<ImageView> imageViewReference;
        private int data = 0;
        private String image_path;

        public BitmapWorkerTask(ImageView imageView) {
            imageViewReference = new WeakReference<ImageView>(imageView);
        }

        @Override
        protected Bitmap doInBackground(Integer... params) {
            data = params[0];
            Bitmap picture = BitmapFactory.decodeFile(image_path);
            int width = picture.getWidth();
            int height = picture.getHeight();
            float aspectRatio = (float) width / (float) height;
            int newWidth = 98;
            int newHeight = (int) (98 / aspectRatio);
            return picture = Bitmap.createScaledBitmap(picture, newWidth,
                    newHeight, true);

        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            if (imageViewReference != null && bitmap != null) {
                final ImageView imageView = imageViewReference.get();
                if (imageView != null) {
                    imageView.setImageBitmap(bitmap);
                }

            }
        }

        public void onDismiss(DialogInterface dialog) {
            this.cancel(true);
        }
    }

这里的问题是,即使我单击了“后退”按钮,任务仍在后台运行。

这样做

private class myAsyncTask extends AsyncTask<Void, String, Void> {
          private boolean isTaskCancelled = false;

          public void cancelTask(){
               isTaskCancelled = true;
          }

          private boolean isTaskCancelled(){
               return isTaskCancelled;
          }

          protected Void doInBackground( Void... ignoredParams ) {
            //Do some stuff
             if (isTaskCancelled()){
                return;
             }
          }


          protected void onPostExecute( Void array )
          {
           //Do something
          }



          protected void onProgressUpdate(String... values)
          {
           //Do something
          }
    }
私有类myAsyncTask扩展了AsyncTask{
私有布尔值isTaskCancelled=false;
公共任务(){
isTaskCancelled=true;
}
私有布尔值已取消(){
退货取消;
}
受保护的Void doInBackground(Void…ignoredParams){
//做点什么
如果(isTaskCancelled()){
返回;
}
}
受保护的void onPostExecute(void数组)
{
//做点什么
}
受保护的void onProgressUpdate(字符串…值)
{
//做点什么
}
}
当您按下“活动”上的后退键时,将asynctask置于取消模式,这样它将停止执行操作

在asynctask中执行的每个步骤中检查已取消的方法,以便在下一行停止它

用于停止
asynctask

task.cancel(true);
在“取消任务”部分中提供了一些其他详细信息:

可以随时通过调用来取消任务。援引 此方法将导致后续调用返回true。 调用此方法后,而不是 将在返回后调用。为了确保尽快取消任务,您应该始终定期检查的返回值,如果可能的话(例如在循环内)


首先,您需要保留对所执行的每个异步任务的引用。当活动暂停时,您应该遍历对asynctask的引用,并使用取消它们。您还应该调用每个异步任务。这将确保UI线程在更改活动之前等待asynctask完成

如果希望异步任务的线程被中断,请使用cancel(true),或者使用cancel(false),在doInBackground()方法中的某些点上,您应该检查并返回


为了安全起见,你必须非常小心地执行任务。查看如何安全处理它们。

asynctask中已经有isCancelled()方法和cancel()方法。没有理由实现你自己的如果你使用你自己的,你会有更多的控制权,就像线程上的CANCEL方法一样,它会停止,但是完成该线程的更好方法是在算法的关键部分检查你的CANCEL,这是在asynctask中为你实现的。如果希望控制取消,则调用cancel(false),然后在算法中只需选中isCancelled()。这正是您所实现的。您可以尝试
cancel(true)
但不能保证始终工作。另外,如果调用此函数,请准备在
doInBackground
中捕获中断异常。
task.cancel(true);