Threading and Loaders. (Android Performance Patterns Season 5, Ep. 8)

Android 性能模式第五季的第八集,之前因为没有使用过 Loader 所以暂时跳过,住院的这些日子,接触了 Loader,发现它真的很好用,接下来,进入视频翻译,地址如下:

https://www.youtube.com/watch?v=s4eAtMHU5gI&t=22s

当 Activity 不在活跃,我们应当如何处理正在进行的线程工作呢?

加载器可以解决这个问题。

目前为止,你可以看 App 中的 Activity 都可以被随时创建以及销毁,无论是响应用户操作还是因为 Android 需要资源。

这就为线程工作提出了一个问题,因为它的工作可能超出了 Activity 的生命周期。

线程工作超过了 Activity 生命周期.png

当你的 Activity 被销毁,但你的线程还依然在运行并持有一些 View 的引用,等待任务结束后对他们做些更新。

如果 Activity 在线程任务之前结束可能会发生一些问题。

首先,因为它还强引用着 View,Activity 对象将被保留在内存中,直到线程任务终于完成。

这就是内存泄漏(内存泄漏指的是由于某些原因未能释放已经不再使用的内存),而这可能导致 App 内容不足,最终导致崩溃。

其次,任务完成之后更新这些 View 是浪费的,因为他们已经不再可见。

最后,你可能需要重复这个任务才能使得 VIew 更新。

你应该让线程工作正确响应 Activity 的生命周期,从而避免这些问题。

这时候你应该使用 Loader。

Loader 是一种对于 Activity 生命周期的内部明智的用法(这个翻译的好差...),你可以确保每次工作都在正确的地方结束。

在正确的地方结束.png

所以 Loader 可以有效的防止内存泄漏,可以正确的更新视图,没有不必要的重复。

让我们来看看它如何工作,你可以在 Activity 中创建一个 LoaderManager 实例,来替代 AsyncTask 或者其他线程上的任务。

将工作发送到 LoaderManager 并且它将确保当 Activity 配置改变时你的任务依然处理得当。

任务开始.png
任务结束.png

LoaderManager 也会将任务结果缓存起来,所以不必重复。

现在如果一个带有正在运行加载器的 Activity 正在被弹出栈,且不会再进入任务栈中,那么这个正在运行的任务会发生什么呢?

这种情况下 LoaderManager 会在你的代码中进行回调,告诉你这个结果永远不会被使用。

你可以使用这个回调终止这个任务,清理和继续其他任务进而不在浪费任何资源。

值得注意的是, Loader 是针对 Activity 的,因此,它为你提供了一个坚实的框架,用于将视图与工作线程分开,并最大限度的减少在 Activity 生命周期中的重复工作。

Loader 的缺点是要使用相当多的额外代码,从而将其正确的集成到你的 App 中。

大量代码.png

这就是本次视频内容,翻译水平还有待提升(主要是翻译成人话),我会继续努力的!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,906评论 25 709
  • 记不得这是上大学以来第几个看起来有些莫名其妙的因为一些压力而独自流泪的夜晚。耳机里放着尧十三的《北方女王》,一个作...
    南方的南方阅读 1,868评论 0 1
  • 成功的人都是相似的,他们懂得克制,擅于利用时间,不把有限的时间用在无谓的事上。他们对自己有时间上的管理,说到这里,...
    卓越小深阅读 384评论 0 0

友情链接更多精彩内容