我正在创建一个Android应用程序,并且由于Bitmap图像而遇到了OOM问题。我当然需要在内存方面使图像更小,但我想练习正确的内存消耗并正确加载它们。
目前,我的布局包含对res / drawable-hdpi文件夹中图像的引用作为其背景。我查看了另一个堆栈溢出问题:outOfMemoryError with background drawables提问的人和我一样有问题。我看到答案说明我应该在java中引用Bitmaps,然后回收onPause并在onResume期间重新设置它们。现在这是否意味着我不应该在xml中设置背景然后在java oncreate中这样做,然后在onResume期间回收并重新设置它们?此外,我正在调查WeakReferencing,但发现自己对此感到困惑......有人能给我一个WeakReferencing的好解释吗?
我感谢所有答案,
干杯,
杰克
答案 0 :(得分:0)
在程序执行期间,如果没有绑定到它的软引用或强引用,则弱引用将是第一个被垃圾收集的引用。因此,如果内存相当低,或者垃圾收集器认为合适的时候,弱引用是垃圾收集,这就是我在代码中包含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()
中将其加载回来。
但是,我认为您还应该在应用程序中查看可以作为弱引用的其他内容。