【问题标题】:How to reduce memory allocation with multiple activities如何通过多个活动减少内存分配
【发布时间】:2016-01-26 00:55:10
【问题描述】:

假设我有一个关于电影/演员的应用。有一个包含电影(或演员)详细信息的活动,在这个活动中,我有 3 个片段的浏览器AB 和 C。每个片段都有我使用 Picasso 和 Ion 从互联网下载的图像。

我正在使用位图,执行转换,将它们调整为图像视图的大小,这样它们就不会占用太多内存。但我不会将它们保存在任何地方,我不需要保存它们。

我有每个片段中有很多图像(我使用回收器 gridview)。片段 B 和 C 具有这些带有电影或演员的网格视图,其中 单击项目会打开新的详细信息活动,其中包含相同的片段和新的项目列表。因此,每次单击网格视图中的项目时,我都可以真正深入地打开新活动。

因此,我迟早会达到 OOM,这取决于 RAM 设备的数量。 (我无法在具有 2gb 内存的真实手机上重现此问题,但 512mb 应用程序在第 5 或第 6 次打开活动时崩溃)。

每次活动打开时分配的内存量都会增加。只有当我回到以前的时候它才会减少。

所以问题是:我应该怎么做才能减少内存使用?我应该以某种方式重用已经存在的活动吗?我不知道如何管理回到以前的电影。是的,一切皆有可能,但我不想让它变得更复杂或更慢。

我已经尝试完成之前的活动。或者在 onStop 方法中删除和回收每个图像视图中的位图。两种方式都不好,因为我必须以某种方式返回并查看数据和图像。并且不要每次都再次下载它们。

我希望你们能给我一个想法,伙计们。由于我是 java 和 android 开发的新手,我可能会遗漏一些东西。

【问题讨论】:

  • 你为什么不缓存你的bitmpas?这正是它的用途!
  • 好的,我想我现在知道它是如何工作的了。到目前为止,你和 Gabe Sechan 帮助我了解了我应该看哪里。让它成为答案,非常感谢你们:)。

标签: java android android-activity bitmap out-of-memory


【解决方案1】:

使用缓存。创建一个固定大小的 LRUCache 并将所有图像放入缓存中。当您需要显示图像时,请检查其是否在缓存中,如果不是从 Internet 下载。使用此解决方案,您将永远不会使用超过图像缓存大小。

如果需要,可以考虑 2 级(内存/磁盘)缓存。下载图像时,将其保存到磁盘。如上所述使用 LRUCache。当图像不在缓存中时,检查它是否在磁盘上,如果是,则从那里读取(并将其放入内存缓存中)。如果它不在磁盘上,请从互联网上获取它。

【讨论】:

  • 是的,但如果我错了,请纠正我。如果需要,毕加索默认使用 LRU 和磁盘缓存。据我所知,它应该在没有任何额外代码的情况下处理任何内存问题?虽然不确定 Ion,但我还是用毕加索加载了大多数图像。或者您建议手动执行此操作,将它们缓存在 onStop 方法中,然后从那里加载 onStart 例如?那我为什么需要毕加索……
  • 如果你因为 OOM 崩溃,要么你没有正确缓存它们,要么你在其他地方泄漏(在这种情况下检查你的 hprofs 并寻找增加的类数)。使用库为您进行缓存的危险在于您需要正确使用库并需要假设库已正确编写。您是否阅读了毕加索代码库以了解它如何缓存并确保您正确使用它?如果不是,那么盲目地假设它会为您完成工作就是人们如何编写带有内存泄漏的蹩脚程序。
  • 好的,我想我现在知道它是如何工作的了。到目前为止,您和 AnixPasBesoin 帮助我了解我应该在哪里看。让它成为答案,非常感谢你们:)。
猜你喜欢
  • 1970-01-01
  • 2011-03-03
  • 2017-01-28
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 2012-08-28
相关资源
最近更新 更多