我正在构建一个带有选项卡导航的 Android 应用程序。 每个选项卡都有自己的返回堆栈,并在用户浏览应用程序时将 fragment 堆积到返回堆栈中。
问题是,当我在 fragment 之间导航时(使用 FragmentTransaction
的替换方法),使用 Picasso 加载图像的 imageView
也保持其状态。这最终会导致 OOM 错误。
我想在替换 fragment 时释放图像内存,并在重新访问时恢复状态。我正在考虑以下方法来解决这个问题。
- 释放适配器使用的内存(
ListAdapter
,FragmentAdapter
, ...) (大多数图像是这些适配器中的项目的展示) - 调用
adapter.clear()
清除 fragment 内容。 - 仅清除
ImageViews
的内容(如果可能..)
我什至不确定其中是否存在实现这些功能的正确方法。 执行此操作的正确方法是什么?
最佳答案
你好,我有同样的问题: fragment 上的 UI 使用 .replace()
方法、Picasso
和内存泄漏!
只需将 Picasso
替换为 Glide
即可将我的应用程序的内存泄漏减少 90% 以上。
比较:https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en
您可以将 fragment 传递给 Glide 而不是 Context - Glide 知道如何处理 fragment 的生命周期。此外,请避免在您的类中创建 Activity 变量 - 对 Activity 的引用很可能会造成泄漏 - 最好将 Activity 或上下文作为参数传递给需要它的每个方法。
防止 android 中的内存泄漏(来自 Google 工程师):https://www.youtube.com/watch?v=_CruQY55HOk 希望对您有所帮助!
关于java - Picasso Android 内存问题,当 fragment 被替换时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41341031/