Threading and Loaders. (Android
Android 性能模式第五季的第八集,之前因为没有使用过 Loader 所以暂时跳过,住院的这些日子,接触了 Loader,发现它真的很好用,接下来,进入视频翻译,地址如下:
当 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 任务结束.pngLoaderManager 也会将任务结果缓存起来,所以不必重复。
现在如果一个带有正在运行加载器的 Activity 正在被弹出栈,且不会再进入任务栈中,那么这个正在运行的任务会发生什么呢?
这种情况下 LoaderManager 会在你的代码中进行回调,告诉你这个结果永远不会被使用。
你可以使用这个回调终止这个任务,清理和继续其他任务进而不在浪费任何资源。
值得注意的是, Loader 是针对 Activity 的,因此,它为你提供了一个坚实的框架,用于将视图与工作线程分开,并最大限度的减少在 Activity 生命周期中的重复工作。
Loader 的缺点是要使用相当多的额外代码,从而将其正确的集成到你的 App 中。
大量代码.png这就是本次视频内容,翻译水平还有待提升(主要是翻译成人话),我会继续努力的!