这是 Android 性能模式第五季的第四集,从本期开始我会修改一下之前的规则,不再一句英文一句中文对应,而是先看完整个视频,边看边翻译,从而整理出重要的知识点。
尽量缩短别人看文章花费的时间,而大量工作我做就好了,就像我们写代码一样, 封装细节后直接提供对方使用。
本期视频地址:
AsyncTask 让我们又爱又恨(不过现在好像很少有人还会用它了吧),不过作为 Android 提供的工具类,它确实提供了一些简单的使用方法,但如果如果使用不当,可能一不小心会伤害我们 App 的性能,比如内存泄漏。
为什么会有 AsyncTask?我们都会遇到类似的场景,比如我解码图片,这确实会花费一些时间,所以我们会选择在后台线程进行,然后任务结束后在主线程更新 UI,如果有很多这种场景,那么我们不用每次都写一遍上面的代码,我们提出公共部分写在一起就可以了,所以 AsyncTask 就诞生了(不过一个 AsyncTask 实例只能执行一次)。
工作流程.pngAsyncTask 为我们提供了一些简单易用的方法,比如当我们使用的它时候,最常用的三个方法就是,下面图中的方法,因为这就已经完全可以让我们完成一个基本的任务,我之前也写过关于 AsyncTask 的学习笔记,地址如下:
AsyncTask 基本工作流程和方法调用.png
虽然我们可以通过重写上面三个方法完成一个简单的 AsyncTask 但你还是需要小心,因为有些细微的问题你需要注意,不然我可能会比较头疼。
接下来,会从三个方面说一下会有哪些小问题需要注意。
首先,我们需要注意 3.2 之后所有 AsyncTask 的任务都默认顺序执行,如果你同时开始了20个任务,那么 AsyncTask 会按照顺序一个个执行任务。
顺序执行任务.png不过我们可以通过通过 executeOnExecutor() 指定执行任务时的线程池,从而实现所有任务并行执行,下过如下图:
并行执行.png第二问题是 cancel(), 看上去它的作用好像是取消一个任务,但是实际上要配合 isCancelled() 使用,我们通过 AsyncTask 对象调用 cancel(),并在 doInBackground() 中使用 isCancelled(),代码如下:
取消任务.pngSo,我们是通过 isCancelled() 判断是否退出,从而决定是否停止任务,不过当我们取消任务后,我们在主线程回调 onCancelled() 而不是 onPostExecute()。
最后一点,也是最关键的一点,就是当我们 AsyncTask 作为普通内部类使用时,从而引起内存泄漏的问题。因为内部类会隐式的持有外部 Activity 的引用,从而使得 Activity 无法被正常回收,直到 AsyncTask 执行完任务。
内部类造成的内存泄漏.png在视频结尾处,又介绍到了这些类,Android 确实给我们提供了一些不错的工具类,当我们在使用的过程中更应该去考虑,它们能帮我解决什么问题,又会带来问题或者隐患,所以不只是使用它们,而是应该搞懂它们的原理,这样才能更好地为我们所有。
又提到了这些类.png如果有机会你其实你也可以去看看官方的视频,挺有趣的,不是么?
网友评论