android 删除文件夹 异步,Android -- 关闭AsyncTask(异步任务)

前面说了如何操作AsyncTask,这篇我们来说一下如何关闭AsyncTask。

有人就问了:为什么要关闭AsyncTask呢?很简单,AsyncTask 是在后台执行耗时操作(获取数据),当你离开当前页面或者结束进程时,也就是跳到你另一个页面不需要当前页面的数据。如果不关闭,其它页面无法显示数据,因为后台还在获取当前页面的数据,也可理解为堵塞。

现在我们再运行一下上一篇博客里的app:

432a8fe20aece20589b1d66e913943e3.png

ebc47a87a70aa1681b57ba54cdfda83f.png

我们点击Back后再次进入App,点击产看数据

3f7c94ded65d41ce7701c78d6ae217d4.png

a09bfc968f8f06236004f4dcc69dd000.png

5c2c8a01e5da80fa0d68ae54d67c7721.png

我们会发现,再次点击时,数据没有立刻加载,而是过了一会才加载。有人会讲是网络问题,但我们是模拟的数据加载,没有经过网络。

这就是上面所讲的堵塞。AsyncTask在执行多个线程时,是单个执行,其它线程是在缓冲区。当执行一个下一个才开始(One by one)

那么怎么关闭呢?

通过api,我们会发现一个 AsyncTask.cancel(true);

A task can be cancelled at any time by invoking cancel(boolean). Invoking this method will cause subsequent calls to isCancelled() to return true. After invoking this method, onCancelled(Object), instead of onPostExecute(Object) will be invoked after doInBackground(Object[]) returns. To ensure that a task is cancelled as quickly as possible, you should always check the return value of isCancelled() periodically from doInBackground(Object[]), if possible (inside a loop for instance.)

意思是:

我们可以随时调用 cancel(boolean)去取消这个加载任务,调用这个方法会间接调用 iscancelled 并且返回true 。

调用cancel()后,在doInBackground()return后 我们将会调用onCancelled(Object) 不在调用onPostExecute(Object)

为了保证任务更快取消掉,你应该在doInBackground()周期性的检查iscancelled 去进行判断。

现在我们就在MainActivity中的onPause(退出时)写入代码

@Override

protected void onPause() {

//如果异步任务不为空 并且状态是 运行时 ,就把他取消这个加载任务

if(task !=null && task.getStatus() == AsyncTask.Status.RUNNING){

task.cancel(true);

}

super.onPause();

}

再在AsyncTask 中加上 红色 代码,判断

public class MyTask extends AsyncTask{

private List userlist;

private BaseAdapter adapter;

private MainActivity activity;

private String barNum;

public MyTask(MainActivity activity) {

this.activity = activity;

}

@Override

protected Object doInBackground(Object... params) {

userlist = (List) params[0];

adapter = (BaseAdapter) params[1];

for(int i=1 ;i<=100;i++){

if(isCancelled()){

break;

}try {

Thread.sleep(300);

} catch (InterruptedException e) {

e.printStackTrace();

}

userlist.add(new User("zhangsan"+i,18+i,"aa"+i+"aa"));

publishProgress(i);

barNum = i+"%";

}

return userlist;

}

@Override

protected void onProgressUpdate(Object... values) {

if(isCancelled()){

return;

}

Button btn = (Button) activity.findViewById(R.id.button1);

btn.setVisibility(View.GONE);

TextView num = (TextView) activity.findViewById(R.id.barNum);

int bar = Integer.parseInt(values[0].toString());

/*bar = (bar)*25;*/

ProgressBar progressBar = (ProgressBar) activity.findViewById(R.id.seekBar1);

progressBar.setProgress(bar);

num.setText(barNum);

//progressBar.setBackgroundColor(activity.getResources().getColor(R.color.orange));

/*progressBar.setBackgroundResource(R.color.orange);*/

adapter.notifyDataSetChanged();

}

}

这时,当我Back后再点进来加载,立马就开始了。有人会觉得疑惑:我在退出前不是cancel 了吗?为什么还要在异步任务中进行分步判断。

当在onPause中 cancel 掉,取消了这个异步加载,但是在AsyncTask 中的isCanceled 值是一直没变,默认false , 即不关闭。

谢谢大家的关注。 I am big!It's the picture that got small.    ---- 我是巨大的!是那些照片让我变得渺小了。(《日落大道》)

Android 多线程----AsyncTask异步任务详解

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

Android中AsyncTask异步

今天我们学习了 AsyncTack, 这是一个异步任务. 那么这个异步任务可以干什么呢? 因为只有UI线程,即主线程可以对控件进行更新操作.好处是保证UI稳定性,避免多线程对UI同时操作. 同时要把耗 ...

Android使用AsyncTask异步线程网络通信获取数据(get json)

摘要: android 4.0以上强制要求不能在主线程执行耗时的网络操作,网络操作需要使用Thead+Handler或AsyncTask,本文将介绍AsyncTask的使用方法. 内容: 1.添加Ht ...

Android 利用 AsyncTask 异步读取网络图片

1.新建Android工程AsyncLoadPicture 新建布局文件activity_main.xml主界面为一个GridView,还有其子项布局文件gridview_item.xml 2.功能主 ...

android 开发-AsyncTask异步任务的实现

AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过 ...

Android线程管理之AsyncTask异步任务

前言: 前面几篇文章主要学习了线程以及线程池的创建与使用,今天来学习一下AsyncTask异步任务,学习下AsyncTask到底解决了什么问题?然而它有什么弊端?正所谓知己知彼百战百胜嘛! 线程管理相 ...

Android --AsyncTask异步任务(一)

1.为什么要异步任务 Android单线程模式 耗时操作放在非主线程(UI线程)中执行 我们都知道Android是单线程模式,只有主线程才能对UI操作,简称UI线程.当然这样的好处是:保证UI的稳定性 ...

Android多线程分析之五:使用AsyncTask异步下载图像

Android多线程分析之五:使用AsyncTask异步下载图像 罗朝辉 (http://www.cnblogs.com/kesalin) CC 许可,转载请注明出处 在本系列文章的第一篇

android AsyncTask异步下载并更新进度条

AsyncTask异步下载并更新进度条    //如果不是很明白请看上篇文章的异步下载 AsyncTask 第一个参数:String 传入 ...

随机推荐

express细节点注意

删除 cookie 需要这么 res.cookie('admin_uid',"null",{maxAge:0, httpOnly:true, path:'/',domain:'.o ...

iOS开发之AFNetworking 3&period;0&period;4使用

昨天使用Cocoapods导入AFN做POST的时候,导入的最新版的3.0.4,突然发现找不到AFHTTPRequestOperationManager了...上github上一看,发现没有这个了.刚 ...

BZOJ3329 &colon; Xorequ

第一问: 打表可得规律:当且仅当x&(x<<1)=0时才会是解,于是数位DP f[i][j][k]表示二进制中前i位,上一位是j,前i位是否等于n的方案数 第二问: 打表可得规律: ...

exec方法

如果 exec 方法没有找到匹配,将返回 null.如果找到匹配项,则 exec 方法返回一个数组,并将更新全局 RegExp 对象的属性以反映匹配结果.数组元素 0 包含了完整的匹配项,而元素 1 ...

css 常见兼容性问题及解决方案

css 兼容问题一直是困扰前端开发人员的大难题,提到兼容性立马想到了万恶的ie6,说多了都是泪,还是整理一些常见的兼容性问题以及解决的方案吧. 一. 浮动元素双边距. ①条件:ie6下,如果给元素设置 ...

ue4&lpar;c&plus;&plus;&rpar; 按钮中的文字居中的问题

.Content() [ SNew(SOverlay) + SOverlay::Slot().HAlign(HAlign_Center).VAlign(VAlign_Center) [ SNew( ...

neutron相关知识

Neutron 对虚拟三层网络的实现是通过其 L3 Agent (neutron-l3-agent).该 Agent 利用 Linux IP 栈.route 和 iptables 来实现内网内不同网络 ...

codeforces794D dfs&plus;图上hash

http://codeforces.com/problemset/problem/794/D 题意:在一个国家有 n 座城市和一些双向边.这些城市被编号为 1 到 n. 一共有 m 条双线边,第 i条 ...

PHP的核心配置详解

1.PHP核心配置详解 代码在不同的环境下执行的结果也会大有不同,可能就因为一个配置问题,导致一个非常高危的漏洞能够利用:也可能你已经找到的一个漏洞就因为你的配置问题,导致你鼓捣很久都无法构造成功的漏 ...

json初接触

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值