Picasso在替换Fragment时出现内存问题(Android)

4
我正在构建一个带有选项卡导航的 Android 应用程序。每个选项卡都有自己的后退堆栈,并在用户浏览应用程序时将片段加载到后退堆栈中。
问题在于,当我在片段之间导航时(使用 FragmentTransaction 的 replace 方法),Picasso 加载图像的 imageView 也会保留其状态。这最终会导致 OOM 错误。
我想在替换片段时释放图片的内存,并在再次访问时恢复状态。我考虑以下几种方法来解决此问题:
  1. 释放适配器(ListAdapterFragmentAdapter 等)所使用的内存(大多数图像是这些适配器中项目的展示)
  2. 调用 adapter.clear() 清除片段的内容。
  3. 仅清除 ImageViews 的内容(如果可能的话...)
我甚至不确定其中哪一个是实现该功能的正确方式。请问应该如何做?

只是提醒一下:如果你的目标是 Android 4.x,你的方法可能不够充分。Android 4.x 在图像方面存在严重问题。基本上无法释放相关内存,直到你结束活动,而这似乎永远不会在你的应用程序中发生。唯一解决该问题的库是 Fresco。然而,它比 Picasso 更具侵入性。 - Codo
面对同样的问题,你有没有解决方案?很想知道! - careful7j
1个回答

1

嗨,我也遇到了同样的问题:在使用.replace()方法、Picasso和内存泄漏的碎片UI中!只需将Picasso替换为Glide,我的应用程序的内存泄漏减少了90%以上。

Glide on Github

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

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

防止Android内存泄漏(来自Google工程师):https://www.youtube.com/watch?v=_CruQY55HOk 希望能帮到您!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接