java - Picasso Android 内存问题,当 fragment 被替换时

标签 java android android-fragments picasso

我正在构建一个带有选项卡导航的 Android 应用程序。 每个选项卡都有自己的返回堆栈,并在用户浏览应用程序时将 fragment 堆积到返回堆栈中。

问题是,当我在 fragment 之间导航时(使用 FragmentTransaction 的替换方法),使用 Picasso 加载图像的 imageView 也保持其状态。这最终会导致 OOM 错误。

我想在替换 fragment 时释放图像内存,并在重新访问时恢复状态。我正在考虑以下方法来解决这个问题。

  1. 释放适配器使用的内存(ListAdapter, FragmentAdapter, ...) (大多数图像是这些适配器中的项目的展示)
  2. 调用adapter.clear()清除 fragment 内容。
  3. 仅清除 ImageViews 的内容(如果可能..)

我什至不确定其中是否存在实现这些功能的正确方法。 执行此操作的正确方法是什么?

最佳答案

你好,我有同样的问题: fragment 上的 UI 使用 .replace() 方法、Picasso 和内存泄漏! 只需将 Picasso 替换为 Glide 即可将我的应用程序的内存泄漏减少 90% 以上。

Glide on Github

比较: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/

相关文章:

Android - Firebase ServerValue.TIMESTAMP 返回 "{.sv=timestamp}"

java - 让线程返回值的正确方法是什么?

java - 如何在 Java 中检查用户输入是 String、double 还是 long

android - JSONArray 与 JSONObject

java - 我怎样才能在中间设置标题栏?

android - RecyclerView.Adapter 使用 viewPager 在 Fragment 中返回空对象引用

java - 选项卡式 Activity 中 android fragment 中的可绘制错误

android - 根据所选项目 ViewModel 类型选择 fragment View

java - Spring 测试 : better use XML configuration over annotations?

java - 为什么我们需要将 long 转换为 byte。现实世界中有这种方法的例子吗?