及时取消代码中的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 ...
随机推荐
- sql left join on
select sysuser.userid, sysuser.groupid, sysuser.sysid, nvl( userjd.mc,nvl(useryy.m ...
- HTML和xhtml,CSS
索引: 初学者入门书籍 高级进阶书籍 W3C官方手册 网站架构 移动平台网站开发 视频资源 开发工具 初学者入门书籍: 中文电子书 深入浅出html pdf中文版 魅丽的网页设计 JAVA WE ...
- C++学习笔记(1)
本学习笔记是C++ primer plus(第六版)学习笔记.复习C++基础知识的可以瞄瞄. 转载请注明出处http://www.cnblogs.com/zrtqsk/p/3874148.html,谢 ...
- js确认删除对话框
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能
Caliburn.Micro学习笔记目录 说一下IHandle<T>实现多语言功能 因为Caliburn.Micro是基于MvvM的UI与codebehind分离, binding可以是双 ...
- linux red hat 给普通用户开启root权限
环境:虚拟机:red hat 6.5:root角色用户:普通用户:宏基笔记本:win7: 操作过程: 1.登录普通用户,进入图形界面(可以设置为启动登录进入命令行界面): 2.按Crl+ALT+F2进 ...
- myeclipse给项目改了名字,但部署tomcat的项目名还是原来的
如标题所示: 在myeclipse中按F2改了项目名称,之前在tomcat中部署的名称是另一个,再次重新部署,永远是上一个的旧名称 解决办法: 项目点右键-properties-左上角搜索框输入web ...
- Win7普通版-X86-SP1-ios-旗舰版安装
------------------------------- 自己的电脑是X64Win7系统.Acer电脑----->>现在改装成 Win7普通版-X86-SP1-ios-旗舰版安装 ...
- ArcGIS将Nodata区设置为0
两个栅格进行叠加,有时会有一部分没有数据,即用identify点击该区域,Value为NoData,而不是像其他非空区域一样有值.此时注意nodata区域要赋予0值,因为nodata+任何数=noda ...
- 开发unity DLL插件
最近开发一款设备的SDK,想着要开发unity版本,怎么做呢?首先想到的就是在外部编写相关的驱动程序然后集成成几个dll作为unity的SDK使用了.So,我就开始了unity外部插件的研究之旅了. ...