如何在退出一个activity后,很好的取消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);

}

}

总结:

经过上面的分析以及网友给出的具体建议,已经将问题解决了,在此,思考问题的同时,还不能忘了如何更好的从理论出发,谢谢技术人的意见,技术人的生活,技术创造未来!

时间: 2024-08-03 14:33:07

如何在退出一个activity后,很好的取消AsyncTask继续运行?的相关文章

Eclipse中在android项目中出现新建一个Activity后,出现整个工程的报错以及包导入以后无法运行等等情况分析。

今天用Eclipse去写android项目,然后后面需要建一个Blank  Activity后,很正常的建立的,然后那个Activity是基于ActionBarAtivity,要导入v7,结果因为这个v7的原因,导致原来的导入包不见了,而且重新导入的时候,虽然工程开启没有报错误,但是接下来在运行的时候,结果运行不了,Logcat出现Classnotfound,但是之前的工程一点事都有.折磨了半天,终于发现错误所在,兼容性问题就不说了,说一下应该怎么解决这样的报错.那就是在新建的时候,你新建一个E

Eclipse中在android项目中出现新建一个Activity后,出现整个project的报错以及包导入以后无法执行等等情况分析。

今天用Eclipse去写android项目,然后后面须要建一个Blank  Activity后,非常正常的建立的.然后那个Activity是基于ActionBarAtivity,要导入v7,结果由于这个v7的原因,导致原来的导入包不见了.并且又一次导入的时候,尽管project开启没有报错误,可是接下来在执行的时候,结果执行不了.Logcat出现Classnotfound,可是之前的project一点事都有.折磨了半天,最终发现错误所在,兼容性问题就不说了,说一下应该怎么解决这种报错.那就是在新

自定义ListView的点击Item项后进入另一个activity背景色改变在pressed或selected等状态时的颜色

在点击进入另一个activity时颜色改变是想在游戏攻略中实现的,但查资料找不到结果,今天突发灵感终于实现了. 我们大多数情况下都是自己写adapter,在写的那个Class中定义一个 boolean 型的 IsJump.然后在 OnItemClickListener 中 把 IsJump 设置为ture,再adapter2.notifyDataSetChanged();  在Adapter中 ture 的情况设置一种颜色就解决问题标记是否读过了.' 自定义ListView的Item项在pres

在一个Activity里面的TextView上面添加网页链接,启动后到另一个Activity里面!

可以添加很多的属性,样式或者是什么的,目前要完成的功能是 点击TextView里面的某个文字链接,进入另外一个Activity里面!例如你可以做微博里面的 @XXX: 点击后进入他的个人主页! 下面都是Activity: package wq.gdky005; import java.util.ArrayList; import android.R.color; import android.app.Activity; import android.content.Context; import

一个Activity掌握Design新控件

一个Activity掌握Design新控件 欢迎转载,转载请注明原文地址:http://blog.csdn.net/lavor_zl/article/details/51295364谢谢. 谷歌在推出Android5.0的同时推出了全新的设计Material Design,谷歌为了给我们提供更加规范的MD设计风格的控件,在2015年IO大会上推出了Design支持包,Design常用的新控件有下面8种. 1. TextInputLayout(文本输入布局) TextInputLayout的作用是

【Android开发-8】生命周期,Activity中打开另外一个Activity

前言:生命中有许多人陪伴自己走过一生中的某段旅程,只是有些人只是某阶段出现,有些人却陪伴自己很久.就像小学.中学.高中.大学,那些曾经以为会长久拥有的,当经历过天涯各地地忙碌于生活,或如意,或失意:渐渐地那些画面只剩回忆.天涯各自安命,能在一起的就尽力珍惜吧,不在一起地就衷心地祝福,我们都需要一种姿态生活下去!Android中的Activity的生命中,我们经常需要打开另外一个Activity,即另外一个界面.这个可能出现的时间很短暂,然后又回到主界面.但是这两个Activity都在各自的生命周

刨根问底U3D---如何退出Play模式后保留数据更改

实际中遇到的需求 在做一款对抗类游戏,目前正在调整游戏的平衡性 所以就产生了一个需求 希望可以在Play模式时候对数据源做的更改可以在退出时候被保存下来. 举个Case, 比如 有一个炮塔 可以发射子弹, 然后有一组敌人 去攻击这个炮塔. 首先点击Play按钮 开始执行游戏逻辑 接着在Inspector中调整相应的数值,比如 射速啊,血量啊,敌人移动速度等等. 按原始的做法 就是调整以后 把所有的数据记录下来(截图或者写纸上) 点Stop进入编辑模式,所有数据回滚原始的 然后再一个一个把刚才改过

Android学习路线(五)开启另一个Activity

在完成了 上一篇课程后,你已经有了一个应用.这个应用展示了一个包含一个文本框和一个按钮的activity(一个单独的界面).在这次的课程中,你将会通过在MainActivity中添加一些代码,来让当给你点击Send按钮时能够跳转到另一个activity中. 响应Send按钮 为了响应按钮的点击事件,打开fragment_main.xml 布局文件,然后在 <Button> 元素中加入android:onClick属性: <Button     android:layout_width=&

在普通class里使用onActivityResult获取从一个activity返回的数据 (待解)

通常当我们需要从当前activity a启动一个activity b,并希望在b finish之前返回一些数据给a,就使用startActivityForResult,onActivityResult,setResult这些函数.但是这些函数是定义在Activity里面的,普通的class里面没有这些函数. 当我希望在一个fragment里面startActivityOnResult另一个activity,并将返回的数据交给fragment所属的activity处理,我在fragment里面定义