android 取消AsyncTask继续运行的解决方案
来源:互联网 发布:暗黑战神 源码分析 编辑:程序博客网 时间:2024/04/28 16:13
问题
当进入一个详细页面,这时程序会弹出一个对话框加载网络数据,可是发现用户经常因为数据加载慢,就快速的退出这个页面,这样反复来回几次后,发现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还在运行,则先取消它
}
}
}
解决方案的理论与解释
设置Activity SingleTask 防止在开启一个Activity的时候 新建一个对象
在Activity 销毁的时候 使用AsyncTask . 取消的那个方法
自己写一个AsynvTask
网友评论:加载网络数据、访问数据库、文件等这些问题,应该另起一个线程并且后台运行,不用让用户等待你的数据加载。
回到你的问题上来,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);
}
}
总结:
经过上面的分析以及网友给出的具体建议,已经将问题解决了
- android 取消AsyncTask继续运行的解决方案
- Android之 如何在退出一个activity后,很好的取消AsyncTask继续运行
- 如何在退出一个activity后,很好的取消AsyncTask继续运行?
- Android AsyncTask 异步任务取消
- 关于asynctask的取消操作
- 取消AsyncTask
- 【Android基础】AsyncTask学习——如何取消掉AsyncTask
- android 异步加载解决方案 AsyncTask
- 关于Asynctask的取消、停止问题。
- Android退出一个activity后取消掉其中的异步线程AsyncTask
- Android多线程-AsyncTask的使用和问题(取消,并行和串行,屏幕切换)
- 从后台切换回来或者从Tabbarcontroller切换回来动画还能继续运行的解决方案
- Android Emulator 不能运行cocos2dx的解决方案
- Android Emulator 不能运行cocos2dx的解决方案
- anroid 取消 AsyncTask
- 如何取消一个AsyncTask?
- Hadoop 伪分布式模式 MapReduce 任务不能继续运行 解决方案
- Android 的AsyncTask使用
- 让App进入后台以后长时间在后台运行,并且能正常接收来自前台的消息
- apk更新、下载、安装(四)---DownloadManager ui方式
- windbg 符号文件设置路径
- AngularJS Documents 官方英文文档
- 多线程操作UI控件——DataGridView假死现象
- android 取消AsyncTask继续运行的解决方案
- stm32和esp8266程序资料分析
- Webview和Html5的交互
- ucenter 整合代码
- 竞聘演讲的技巧
- 调整eclipse或sts类存大小
- 我的OpenCV学习笔记(六):使用支持向量机(SVM)
- awk内建变量示范详解之NR、FNR、NF
- CUDA入门(1):环境配置与代码高亮显示