【问题标题】:Loading Bitmaps Properly in Android在 Android 中正确加载位图
【发布时间】:2013-08-23 05:50:56
【问题描述】:

我正在创建一个 android 应用程序,但由于位图图像而遇到了 OOM 问题。我当然需要使图像在内存方面更小,但是我想练习正确的内存消耗并正确加载它们。

目前我的布局包含对 res/drawable-hdpi 文件夹中图像的引用作为它们的背景。我查看了另一个堆栈溢出问题:outOfMemoryError with background drawables 提出问题的人与我有同样的问题。我看到答案表明我应该在 java 中引用位图,然后在 onResume 期间回收 onPause 并重新设置它们。现在这是否意味着我不应该在 xml 中设置背景,然后在 java oncreate 中这样做,然后在 onResume 期间回收并重新设置它们?另外,我正在研究弱引用,但发现自己对此感到困惑......谁能给我一个关于弱引用的好解释?

感谢所有答案,

干杯,

杰克

【问题讨论】:

标签: android bitmap


【解决方案1】:

在程序执行期间,如果没有绑定软引用或强引用,弱引用将首先被垃圾回收。因此,如果内存非常低,或者当垃圾收集器认为合适时,弱引用就会被垃圾收集,这就是为什么我在我的代码中包含 else 语句来显示这种情况的发生。
来源:http://www.javacodegeeks.com/2012/01/understanding-java-weak-references.html

当你做一个弱引用时,你告诉 GC 这个人占用的内存需要先被释放。你通过调用System.gc()释放内存

同样,关于这个问题还有另一个答案:
Java: difference between strong/soft/weak/phantom reference

维基百科有一个更简单的例子:
http://en.wikipedia.org/wiki/Weak_reference#Java

在您的情况下,假设您正在加载一个相当大的高清图像作为背景。然后你需要做一些更多的数据加载到内存中等等导致OOM。你可以做的是在onStop() 中释放这个GD 图像所持有的内存,然后在onResume() 中加载它。
但是,我认为您还应该研究您的应用中可以被弱引用的其他内容。

【讨论】:

  • 好的,我现在更了解弱引用了。但是,我应该如何加载当前用作某些按钮和布局背景的图像?我不应该在 xml 中引用它们,然后在 java 中设置背景吗?我理解 onStop() 和 onResume() 的原因,但是我不明白它是如何正确实施的。
  • 那么您的意思是,我不应该将我在 XML 中的视图的背景设置为任何东西......我应该像链接中所说的那样引用它们,然后使用 Java 设置它们?
  • 是的。需要时动态加载,不需要时清除
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
相关资源
最近更新 更多