在启动新的Activity或Fragment时,强制停止在Fragment中执行数据库调用的AsyncTasks

时间:2016-05-19 15:26:24

标签: android android-fragments android-asynctask android-gridview

我正在尝试使用来自网络的图像填充GridView,我称之为web服务(我没有图像的直接URL)。
为此,我正在使用Volley imageRequest。

一切都很好,除了需要一些时间来填充,当我在相同的片段或活动时,这是可以的。
但是当我点击每个单元格时,它应该在另一个Activity中打开,当GridView仍在填充时,需要很长时间才能打开另一个Activity。

当我想发布另一个Activity时,有人可以建议我如何停止所有异步数据库调用吗? 我尝试在ifCancelled()doInBackground()内使用postExecute() 我尝试取消onPause()onStop()onDestroy()onDetach()内的任务。

似乎没有任何效果 我也尝试过使用Picasso和Glide,但他们需要一个直接的URL。

我的异步任务:

    private class GridImageTask extends AsyncTask<DevicePhoto, Void, Bitmap> {
        private int mPosition;
        private ViewHolder mHolder;
        private volatile boolean running = true;
        private final WeakReference<ImageView> imageViewReference;


    public GridImageTask(int position, ViewHolder holder) {
        mPosition = position;
        mHolder = holder;
        imageViewReference = new WeakReference<ImageView>(mHolder.imageview);
    }



    @Override
    protected Bitmap doInBackground(DevicePhoto... arg0) {
        Bitmap retBitmap = null;

      //  if(mTask.isCancelled()){
          //  retBitmap = null;
       // }else if(mTask.getStatus() != Status.PENDING || mTask.getStatus() != Status.FINISHED) {

        Log.i(TAG, "mTask.isCancelled()==="+mTask.isCancelled());
        Log.i(TAG, "mTask.running()==="+mTask.running);
        Log.i(TAG, "mTask.position()==="+mTask.mPosition);
        if(!isCancelled()){
            DevicePhoto photo = arg0[0];
            requestPicture(mPosition, photo);
            retBitmap = images.get(mPosition).thumbnail;
            //notifyDataSetChanged();

        }
        return retBitmap;


    }

    @Override
    protected void onPreExecute() {

        running = true;
        //super.onCancelled();
    }

  @Override
    protected void onCancelled() {

        mTask.cancel(true);

        running = false;
        //super.onCancelled();
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {

        if (isCancelled()) {
            bitmap = null;
        }
       // bitmap = images.get(mPosition).thumbnail;
        if (mHolder.id == mPosition && bitmap != null) {

            if (imageViewReference != null) {

                bitmap = Bitmap.createScaledBitmap(bitmap, 200, 200, false);
                ImageView imageview = (SnapCheckableImageView) imageViewReference.get();
                if (imageview != null) {
                    imageview.setImageBitmap(bitmap);
                    //notifyDataSetChanged();
                }

            }

        }

    }

我在onStop()中的fragment中使用我的适配器类调用以下方法。

gridFragment类的onStop()我调用以下方法:

public void cancelAsynTaskOnStop(){

 //   Log.i(TAG, "cancelAsynTaskOnStop mTask.running >>>> "+mTask.running+ "mPosition == "+mTask.mPosition+" hmTaskMap.size() == "+hmTaskMap.size()+" task.getStatus() >> "+mTask.getStatus());

    if(mTask != null){
        mTask.cancel(true);
        mTask.running = false;
    }

    if(hmTaskMap.size() > 0){
        Iterator itr = hmTaskMap.keySet().iterator();


        while(itr.hasNext()){
            GridImageTask task = (GridImageTask)hmTaskMap.get(itr.next());
            Log.i(TAG, "task.running === "+task.running+" task.mposition === "+task.mPosition+" status == "+task.getStatus());
            if(task != null){
                task.cancel(true);
                task.running = false;

                Log.i(TAG, "inside task.running === "+task.running+" task.mposition === "+task.mPosition+" status == "+task.getStatus());
            }

1 个答案:

答案 0 :(得分:0)

AsyncTask.cancel()不会在不考虑后果的情况下终止线程。它只是将AsyncTask设置为“已取消”状态。由AsyncTask的开发人员来决定是否遵守取消状态。

AsyncTask不应该用于长时间操作,因为它可以block other worker tasks