Good AsyncTask Hunting. (Android Performance Patterns Season 5, Ep. 4)

这是 Android 性能模式第五季的第四集,从本期开始我会修改一下之前的规则,不再一句英文一句中文对应,而是先看完整个视频,边看边翻译,从而整理出重要的知识点。

尽量缩短别人看文章花费的时间,而大量工作我做就好了,就像我们写代码一样, 封装细节后直接提供对方使用。

本期视频地址:

https://www.youtube.com/watch?v=jtlRNNhane0

AsyncTask 让我们又爱又恨(不过现在好像很少有人还会用它了吧),不过作为 Android 提供的工具类,它确实提供了一些简单的使用方法,但如果如果使用不当,可能一不小心会伤害我们 App 的性能,比如内存泄漏。

为什么会有 AsyncTask?我们都会遇到类似的场景,比如我解码图片,这确实会花费一些时间,所以我们会选择在后台线程进行,然后任务结束后在主线程更新 UI,如果有很多这种场景,那么我们不用每次都写一遍上面的代码,我们提出公共部分写在一起就可以了,所以 AsyncTask 就诞生了(不过一个 AsyncTask 实例只能执行一次)。

工作流程.png

AsyncTask 为我们提供了一些简单易用的方法,比如当我们使用的它时候,最常用的三个方法就是,下面图中的方法,因为这就已经完全可以让我们完成一个基本的任务,我之前也写过关于 AsyncTask 的学习笔记,地址如下:

http://www.jianshu.com/p/3a1581cf2cbe

AsyncTask 基本工作流程和方法调用.png

虽然我们可以通过重写上面三个方法完成一个简单的 AsyncTask 但你还是需要小心,因为有些细微的问题你需要注意,不然我可能会比较头疼。

接下来,会从三个方面说一下会有哪些小问题需要注意。

首先,我们需要注意 3.2 之后所有 AsyncTask 的任务都默认顺序执行,如果你同时开始了20个任务,那么 AsyncTask 会按照顺序一个个执行任务。

顺序执行任务.png

不过我们可以通过通过 executeOnExecutor() 指定执行任务时的线程池,从而实现所有任务并行执行,下过如下图:

并行执行.png

第二问题是 cancel(), 看上去它的作用好像是取消一个任务,但是实际上要配合 isCancelled() 使用,我们通过 AsyncTask 对象调用 cancel(),并在 doInBackground() 中使用 isCancelled(),代码如下:

取消任务.png

So,我们是通过 isCancelled() 判断是否退出,从而决定是否停止任务,不过当我们取消任务后,我们在主线程回调 onCancelled() 而不是 onPostExecute()。

最后一点,也是最关键的一点,就是当我们 AsyncTask 作为普通内部类使用时,从而引起内存泄漏的问题。因为内部类会隐式的持有外部 Activity 的引用,从而使得 Activity 无法被正常回收,直到 AsyncTask 执行完任务。

内部类造成的内存泄漏.png

在视频结尾处,又介绍到了这些类,Android 确实给我们提供了一些不错的工具类,当我们在使用的过程中更应该去考虑,它们能帮我解决什么问题,又会带来问题或者隐患,所以不只是使用它们,而是应该搞懂它们的原理,这样才能更好地为我们所有。

又提到了这些类.png

如果有机会你其实你也可以去看看官方的视频,挺有趣的,不是么?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,822评论 25 707
  • Android Handler机制系列文章整体内容如下: Android Handler机制1之ThreadAnd...
    隔壁老李头阅读 3,193评论 1 15
  • Android开发者:你真的会用AsyncTask吗? 导读.1 在Android应用开发中,我们需要时刻注意保证...
    cxm11阅读 2,703评论 0 29
  • 当某个应用组件启动且该应用没有运行其他任何组件时,Android 系统会使用单个执行线程为应用启动新的 Linux...
    小芸论阅读 1,679评论 0 12
  • 六十四岁的自己是一个什么样的生活状态呢?你有没有想过? 我妈妈今年刚好六十四岁,她现在的主要任务是照看我的小侄女,...
    冬日霞光阅读 658评论 3 0