Good AsyncTask Hunting. (Android

作者: Gzw丶南山 | 来源:发表于2017-04-12 17:07 被阅读9次

    这是 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

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

    相关文章

      网友评论

        本文标题:Good AsyncTask Hunting. (Android

        本文链接:https://www.haomeiwen.com/subject/mlmmattx.html