继上篇简单介绍AsyncTask之后,本片开始介绍下AsyncTask的优缺点。
(注:本人所写文章仅作为自己学习使用)

AsyncTask的优点:

封装了Thread和Handler给用户使用,操作比较简单。用户需要使用时,仅需继承AsyncTask,并重写其中的doInBackground方法就可以,若是希望子线程的执行结果反馈到UI线程上,则将onPreExecute(告知UI线程,子线程开始执行)和onPostExectute(将子线程执行的结果反馈给UI线程)和onProgressUpdate(可以实时的将子线程的执行过程反馈给UI,一般是使用进度条)重写就可以。

AsyncTask的缺点

  1. 旋转屏幕
    使用AsyncTask的最初目的是希望为UI线程开启一个后台线程,用于与之进行交互。因为常见对AsyncTask的使用是去执行一个耗时操作,并在结束后(AsyncTask.onPostExecute())更新UI。但是旋转屏幕,当前的Activity会被销毁然后重建,Activity重启后,此时AsyncTask对Actvity的引用是invalid,因为他指向的还是前一个没有转屏前的Activity,并不是重建后的Activity,So onPostExecute对重建后的Activity是没有意义的。这点尤其是在将AsyncTask作为Activity的内部类,AsyncTask会隐式应用当前Activity的时候给人制造困惑。
    避免该问题的一个常规做法是,保留对AsyncTask的引用,该引用在配置更改之间持续,在重新启动时更新目标Activity。
  2. 生命周期
    AsyncTask的生命周期和Activity的生命周期不同步。不管Activity的生命周期是否已经结束(即使是application已经退出),AsyncTask会一直执行到doInBackground结束,之后,会选择下面的某一种方式继续执行:
    a) 如果cancel(boolean)调用了,则执行onCancelled(Result)方法
    b) 如果cancel(boolean)没有调用,则执行onPostExecute(Result)方法
    只有一种提早finish AsyncTask方式:通过AsyncTask.cancel()来取消AsyncTask任务。也就是说你需要手动取消AsyncTask,否则你会冒着不必要的后台任务拖垮你的应用程序的风险,或者内存泄露。当你明确不在需要AsyncTask的时候,请确保手动取消该AsyncTask,以免后续在执行APP的过程中出现别的问题。
  3. Cancelling AsyncTask
    假设使用AsyncTask来执行一个查询操作。用户可能会在查询的过程中修改参数,此时你需要调用AsyncTask.cancel()来结束当前的任务,然后发起一个新的AsyncTask来执行用户修改完参数的查询。这种方法看起来是ok的,但是当check log的时候,我们会发现当前所有的AsyncTask都在运行,cancel方法并没有任何的意义,就算mayInterruptIfRunning这个参数为True。
    Why?
    问题发生在AsyncTask.cancel()这个方法上,该方法并不会不计后果的杀死后台线程,它所有的操作唯有将AsyncTask的状态置为“canceled”,然后依赖用户去检查AsyncTask是否被cancel掉了,如果用户发现AsyncTask已经被cancel了,然后才可以终止操作(这句话不是很理解)。对于参数mayInterruptIfRunning,它只是给后台正在运行的线程发了一个interrupt(),在后台线程不可中断的情况下,它根本不会停止线程。
    有两种简单的方案可以解决大多数上面的问题:
    在耗时较长的任务中,定期检查AsyncTask.isCancelled(),或者保持线程可中断。
    无论哪种方式,当调用AsyncTask.isCancelled()时,这些方法都会阻止您的任务执行比必要时间更长的时间。

但是,这个建议并不总是有效的——如果您调用了一个不可间断且耗时较长的方法(比如BitmapFactory.decodeStream())呢?我在这种情况下所获得的唯一成功就是创建了一个导致抛出异常的情况(在本例中,过早地关闭了BitmapFactory使用的流)。这意味着单独的取消不能解决这个问题——需要外部干预

  1. 并发任务数量受限
    AsyncTask任务运行于线程池的。一般线程池的大小是固定的,这就导致AsyncTask可以并发的任务也是固定的。Android 1.5规定AsyncTask仅允许存放128个并发任务,同一时间只有10个任务可被同时处理(这10个任务以队列的形式存放)。也就是说如果你在完成138个任务之前排队,你的应用程序就会崩溃。大多数情况下,当人们使用AsyncTask从网络上加载Bitmaps时,会有这个问题。

当你发现自己面临这种限制的时候,应该考虑下你代码的设计,为什么会有这么多需要后台执行的任务了。或者另一种可以选择的方式为,为当前的任务创建一个较智能的队列,不要一次性并发执行那么多的代码。你要是实在是接受不了,可以重新定义AsyncTask的线程池大小。

总结:

由于AsyncTask的生命周期和Activity的生命周期不同步,并不会随着Activity的销毁而销毁,所以有时候会造成Activity的内存无法销毁,造成内存泄露,此其一。

也是因为AsyncTask的生命周期并不随着Activity的的销毁而销毁,导致在转屏的时候,转屏前AsyncTask的执行内容并没有传给转屏后的Activity,相当于AsyncTask的执行结果白白浪费了,此其二。

AsyncTask的任务运行于线程池,线程池的大小固定,要是想要执行的任务超出线程池规定的大小,会造成Crash,而且在Android1.5之后规定,不建议并发执行任务,此其三。

其他的,等后续继续补上。

参考:
https://blog.danlew.net/2014/06/21/the-hidden-pitfalls-of-asynctask/

AsyncTask的优缺点相关推荐

  1. android编程任务进度条,Android应用开发之AsyncTask 处理耗时操作和显示进度条

    在Android中实现异步任务机制有两种,Handler和AsyncTask.优缺点自己百度,推荐使用AsyncTask. private ProgressDialog dialog; //新建一个对 ...

  2. android asynctask 参数,Android中AsyncTask详解

    定义 AsyncTask是一个抽象类,在使用时需要继承该类,实现其抽象方法protected abstract Result doInBackground(Params... params).其主要作 ...

  3. App研发录读后总结(一)

    2019独角兽企业重金招聘Python工程师标准>>> 通过一段时间的学习,阅读完了<App研发录>,此书同之前阅读的其他书,如 xx入门,xx提高不同,不是针对具体知识 ...

  4. Android 中的线程及 AsyncTask(线程形态之一)解析一下

    科普一下 线程是操作系统调度的最小单元. 线程在android中是一个很重要的概念. 主线程 也叫 UI 线程 作用: 运行四大组件以及处理他们和用户交互. 子线程 作用; 执行耗时任务. 比如 I/ ...

  5. android AsyncTask介绍(转)

    android AsyncTask介绍 AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接 ...

  6. android中AsyncTask和Handler对比

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

  7. android服务绑定异步,Android中异步类AsyncTask用法总结

    本文总结分析了Android中异步类AsyncTask用法.分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独 ...

  8. Android源码之路(二、AsyncTask)

    参考 https://www.baidu.com/link?url=QNRznJEBT25k0bpgVD3bOniOia2W85eiPIWrS93YFknyrHoFDGrJVtoax2ZYpiiErt ...

  9. Android之——AsyncTask和Handler对照

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46952835 AsyncTask和Handler对照 1 ) AsyncTask实 ...

最新文章

  1. C#利用ICSharpCode.SharpZipLib.dll压缩文件和解压文件
  2. SimpleDateFormat使用具体解释
  3. 如何通便清肠快速见效_如何三个月合理瘦身减脂
  4. BSP UI Workbench double click component and see view list
  5. 6、struts.properties配置详解
  6. 如何给定两个gps坐标 算出航向角_机器人开发如何配置ROS中的TF变换关系?
  7. 微擎微信公众号小程序框架v2.7.3去sq一键安装纯净商业版
  8. 视觉SLAM笔记(6) 坐标系
  9. iOS TableView多级列表
  10. 【Sofa】Sofa比赛成绩记录
  11. springboot使用Log4j动态改变日志级别
  12. RK987A键盘蓝牙连接电脑
  13. 极简主义、人工智能与Readhub的产品哲学
  14. 毕业设计:基于java的小区物业信息管理系统的设计与实现(1)
  15. hdu5454 Excited Database (线段树)
  16. 常识-idea里鼠标左键选择变成矩形块
  17. ceph v15.2.13版本[octopus]分布式集群部署
  18. 毕业近一个月,工作近期的一些感受。
  19. 【c++入门(2)】关联容器map
  20. 44.求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和

热门文章

  1. CA6140车床拨叉工艺及铣30X80面夹具设计
  2. meta http-equiv=Content-Type content=text/html; charset=gb2312设置中文显示
  3. 金融行业部分公司待遇汇总
  4. 菜鸟的linux云服务器第一次木马入侵处理记录(名为xmrigMiner的木马)
  5. kafka:工具:kafkaTool 使用方法
  6. 俞敏洪大学经典励志演讲:像树一样活着
  7. Google Map 初步使用
  8. 耳机声音一边大一边小
  9. 使用python将动图转换为视频
  10. Android 同步网络时间