如何在退出一个activity后很好的取消AsyncTask继续运行-创新互联

这篇文章将为大家详细讲解有关如何在退出一个activity后很好的取消AsyncTask继续运行,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

专注于为中小企业提供成都做网站、网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业甘井子免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了数千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

问题

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

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

初步解决代码方案:

public class Task extends AsyncTask{
@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 {

      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);

      }

  }

关于如何在退出一个activity后很好的取消AsyncTask继续运行就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


新闻名称:如何在退出一个activity后很好的取消AsyncTask继续运行-创新互联
文章位置:http://scyanting.com/article/dihjjh.html