【问题标题】:Picasso Android memory issues, when fragment is replacedPicasso Android 内存问题,当 Fragment 被替换时
【发布时间】:2017-05-11 11:54:26
【问题描述】:

我正在构建一个带有标签导航的安卓应用。 每个选项卡都有自己的后台堆栈,并在用户浏览应用程序时将片段堆积到后台堆栈中。

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

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

  1. 释放用于适配器的内存(ListAdapter, FragmentAdapter, ...) (大部分图片都是这些适配器中的物品的展示)
  2. 调用adapter.clear()清除分片内容。
  3. 仅清除 ImageViews' 内容(如果可能的话..)

我什至不确定其中是否存在实现这些功能的正确方法。 这样做的正确方法是什么?

【问题讨论】:

  • 只是一个警告:如果您的目标是 Android 4.x,那么您的方法可能还不够。 Android 4.x 在图像方面存在严重问题。在您结束活动之前,它基本上无法释放相关的内存,这在您的应用程序中似乎从未发生过。解决该问题的唯一库是Fresco。但是,它比毕加索更具侵略性。
  • 遇到同样的问题,你有解决办法吗?很有趣!

标签: java android android-fragments picasso


【解决方案1】:

嗨,我也有同样的情况: 片段上的 UI 使用 .replace() 方法、Picasso 和内存泄漏! 只需将 Picasso 替换为 Glide 即可将我的应用程序的内存泄漏减少 90% 以上。

Glide on Github

比较:https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en

您可以将片段传递给 Glide 而不是 Context - Glide 知道如何处理片段的生命周期。此外,请避免在您的类中创建 Activity 变量 - 对 Activity 的引用很可能会造成泄漏 - 最好将 Activity 或上下文作为参数传递给每个需要它的方法。

防止 android 中的内存泄漏(来自 Google 工程师):https://www.youtube.com/watch?v=_CruQY55HOk 希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多