android 取消AsyncTask继续运行的解决方案

问题

当进入一个详细页面,这时程序会弹出一个对话框加载网络数据,可是发现用户经常因为数据加载慢,就快速的退出这个页面,这样反复来回几次后,发现AsyncTask不再继续加载,而是慢慢的等待,查了下个数,是前几个没有及时的关闭,导致当前的异步任务一直在等待。

所以想请教如何在退出一个页面后,也同时关闭对应的异步任务?

初步解决代码方案:

public class Task extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... path) {
// Task被取消了,马上退出循环
if(isCancelled()) return null;
}

@Override
public void onProgressUpdate(File... files) {
// Task被取消了,不再继续执行后面的代码

if(isCancelled()) return;
.........
}
}

UI线程:

// 保持对Task的引用

private PhotoTask task;

// 1,启动新的任务
task = new PhotoTask();
task.execute(path);

// 2, 取消任务

if (task != null && task.getStatus() == AsyncTask.Status.RUNNING) {
task.cancel(true); // 如果Task还在运行,则先取消它
}

}

}

解决方案的理论与解释

  1. 设置Activity SingleTask 防止在开启一个Activity的时候 新建一个对象

    1. 在Activity 销毁的时候 使用AsyncTask . 取消的那个方法

    2. 自己写一个AsynvTask

  2. 网友评论:加载网络数据、访问数据库、文件等这些问题,应该另起一个线程并且后台运行,不用让用户等待你的数据加载。
    回到你的问题上来,AsyncTask用的是线程池,线程不用就会放回池中. 有新的AsyncTask会取出已有线程,之后开始执行,这就是导致你有多个AsyncTask的原因。所以即使调用AsyncTask的cancle方法,你会发现依旧结束不了这个东西。
    你尝试在关闭界面的同时获得当前界面绑定的那个AsyncTask对象,并将其设置为空。如果依旧不行,那就可以考虑自己封装一个下载线程啦

最后调试后的代码

public class LoadPage extends AsyncTask<Void, Void, Void> {


        private volatile boolean running = true;

        private final ProgressDialog progressDialog;


        public LoadPage(Context ctx) {

            progressDialog = new ProgressDialog(ctx);


            progressDialog.setCancelable(true);

            progressDialog.setOnCancelListener(new OnCancelListener() {

                @Override

                public void onCancel(DialogInterface dialog) {

                    running = false;

                }

            });


        }


        @Override

        protected void onPreExecute() {

            progressDialog.show();

        }


        @Override

        protected void onCancelled() {

            running = false;

        }

       

        @Override

        protected Void doInBackground(Void... params) {


            while(running){

                // does the hard work one,two,three,

                Log.e("tag","run..");

            }

            Log.e("tag","exit");

            return null;

        }


        // ...

        @Override

        protected void onPostExecute(Void result) {

            super.onPostExecute(result);

            

        }

    }

总结:

经过上面的分析以及网友给出的具体建议,已经将问题解决了

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值