及时取消代码中的AsyncTask
在一个Activity页面,如果发起了AsyncTask任务,然后页面离开/销毁了,此时如果doInBackground没执行完,会有两个问题:
1, AsyncTask白白消耗资源,结果已经用不上了,因为UI也不在;
2, AsyncTask如果声明为Activity的内部类,会持有Activity这个宿主类,导致Activity内存泄露。
所以一定要在Activity onDestory的时候cancel掉AsyncTask任务。
怎么从一个App的架构层面来约束所有的业务模块都自动做这个事情呢?
1, 自定义一个AutoCancelAsyncTask,继承AsyncTask,定义一个成员变量,叫id。
2, 定义一个TaskManager单例类,维护一个AutoCancelAsyncTask队列。
3, 在AutoCancelAsyncTask的构造方法中,把自己加到TaskManager的队列。
4, 在AutoCancelAsyncTask中重写onCancelled和onPostExcute方法,调用TaskManager的一个方法,这个方法从队列中删除id对应的AutoCancelAsyncTask。
5, 定义BaseActivity,这个类生成一个唯一标识自己的id。
6, 业务Activity都继承BaseActivity,发起的AsyncTask都继承AutoCancelAsyncTask,并传入activity的唯一id给AutoCancelAsyncTask的id。
7, 在BaseActivity的onDestory方法中调用TaskManager的一个方法,这个方法接收当前activity的id,然后遍历队列,找到与传入的id相同的AutoCancelAsyncTask,然后调用其cancel方法。
PS:
1, 如果害怕业务子类重写AutoCancelAsyncTask的onCancelled或者onPostExcute的时候不调用super导致没从队列中删除这个Task,可以final这两个方法,给子类另外留两个接口出来;
2, 假如doInBackground中是个慢操作任务,调用cancel基本都能取消掉提现结束;但如果是个循环,没用! 所以好的做法是在循环的条件判断中假如this.isCancelled()判断,如果是true,直接break循环。
及时取消代码中的AsyncTask的更多相关文章
- eclipse 代码中突然出现特殊字符
在写代码的时候,不知道点到了 eclipse 的哪个属性,代码中就出现了一些特殊字符,也不能删除. 请问,在 eclipse 中该怎么设置,才能将这些字符去掉. 如下图所示: 解决方法: 选择Wind ...
- eclipse 包 取消代码第一行package包名 自动补全时取消自动引入包名 修改名字 取消引用 自动导入publilc static void main(String[] args) {}
--项目 --包 包是为了管理类文件,同个包下不允许同名类文件,但不同包就可以,把类放在包里是规范 (https://zhidao.baidu.com/question/239471930532952 ...
- 在VS代码中使用版本控制
在VS代码中使用版本控制 Visual Studio Code集成了源代码控制,并包含了内置的Git支持.许多其他源代码控制提供程序可通过VS Code Marketplace上的扩展获得. Git历 ...
- Android用PhoneGap封装webapp在android代码中实现连按退出和loadingpage
用PhoneGap封装后的程序有一些瑕疵,比如启动时黑屏,菜单按钮和返回按钮不好控制等. PhoneGap也在github提交的它的源码(版本:2.8): https://github.com/apa ...
- 编程风格---代码中doxygen方式的注释写法
代码中doxygen方式的注释写法: 1. 模块定义(单独显示一页) /* * @defgroup 模块名 模块的说明文字 * @{ */ … 定义的内容 … /** @} */ // 模块结尾 2. ...
- Android代码中设置字体大小,字体颜色,显示两种颜色.倒计时效果
Android代码中设置字体大小,字体颜色,显示两种颜色 在xml文件中字体大小用的像素 <TextView android:id="@+id/uppaid_time" an ...
- 策略模式+注解 干掉业务代码中冗余的if else...
前言: 之前写过一个工作中常见升级模式-策略模式 的文章,里面讲了具体是怎样使用策略模式去抽象现实中的业务代码,今天来拿出实际代码来写个demo,这里做个整理来加深自己对策略模式的理解. 一.业务 ...
- 移动端网站如何开发(电脑端网站到手机端网站我们需要在html代码中添加哪个meta标签)
移动端网站如何开发(电脑端网站到手机端网站我们需要在html代码中添加哪个meta标签) 一.总结 一句话总结: 添加viewport标签:meta name="viewport" ...
- Python-Jenkins API使用 —— 在后端代码中操控Jenkins
最近在工作中需要用到在后台代码中触发Jenkins任务的构建,于是想到Jenkins是否有一些已经封装好的API类库提供,用于处理跟Jenkins相关的操作.下面就简单介绍下我的发现. Linux C ...
随机推荐
- WINDOW的cmd的命令【转载】
转载地址:https://zhidao.baidu.com/question/583956458.htmlwinver---------检查windows版本 wmimgmt.msc----打开win ...
- 通过trie树单词自动补全(二)
经常使用iciba进行单词查询, 关于他的搜索建议是通过单词前缀做的索引, 所以自己想动手实现下, 当然如果借助mysql的话,一条sql语句就能实现, 网上查询了下trie正适合做这个,所以通过C语 ...
- React业务实践
总结自:http://reactjs.cn/react/docs/thinking-in-react-zh-CN.html 当接到一个需求时,如何用react来实现? 以下几个步骤做参考. 第一步:把 ...
- IE 6 全球分布图 - 中国一枝独秀
随着 Windows 8.1 预览版的发布,IE11也与大家见面了,不久后 IE 11 还将登陆 Windows 7 平台.但是,时至今日,在世界的某个地方,仍然有大量的用户在使用老态龙钟的 IE 6 ...
- EXT总结例子
//页面按钮点击展开隐藏 { 空格 xtype:'fieldset', title:'<b>高级搜索< ...
- FineUI小技巧(5)向子窗口传值,向父窗口传值
前言 FineUI中经常会用到启用IFrame的Window控件,这样有助于从物理上进行代码解耦和.IFrame的引入就会涉及传值问题,如何在父窗口和子窗口之间相互传值呢? 向子窗口传值 向子窗口传值 ...
- 【kAriOJ】离散数学 构造群码 极大似然法解码
A. 编程题1 构造群码 时间限制 1000 ms 内存限制 65536 KB 题目描述 针对给定H,计算群码编码函数eH,并计算给定字的码字. 输入格式 第一行输入两个整数m,n:(m < n ...
- Python项目之我的第一个爬虫----爬取豆瓣图书网,统计图书数量
今天,花了一个晚上的时间边学边做,搞出了我的第一个爬虫.学习Python有两个月了,期间断断续续,但是始终放弃,今天搞了一个小项目,有种丰收的喜悦.废话不说了,直接附上我的全部代码. # -*- co ...
- elastichq 离线安装
plugin install file:///home/hadoop/xxxx.zip 奇怪的是,这样安装成功后访问host:port:9200/_plugin/hq/ 仍然会报错,找不到一些js函数 ...
- 什么是pe系统
Winpe全称 Windows Preinstall Environment,即“Windows 预安装环境”.是一个用于Windows 安装准备的最小操作系统. 基于保护模式下运行Windows X ...