我有一个用户评论,在我的应用程序中查看了一堆图像后,它崩溃了(他认为这是由于内存不足错误)。我有以下相关代码:
int themeID = mNav[mPos];
String icon = getThemeData(DbAdapter.KEY_ICON, themeID);
ImageView viewer = (ImageView)findViewById(R.id.viewer);
Bitmap bMap = null;
try {
bMap = getJPG(icon + ".jpg");
} catch (IOException e) {
e.printStackTrace();
}
viewer.setImageBitmap(bMap);
当用户在图像之间翻转时,这会变得很糟糕。从here我看到你应该在位图上调用recycle()。设置图像后,是否需要在bMap上调用它?或者是否有某种方法可以在设置下一个之前将其从viwer中拉出来?
根据回收文档(如果我在bMap上调用它),似乎我不需要使用它:这是一个高级调用,通常不需要调用,因为正常的GC过程将释放这个没有更多对此位图的引用时的内存。
答案 0 :(得分:0)
如果您需要显式调用recycle()
,则可能意味着您有内存泄漏。调用它几乎不是解决方案。
您是否尝试检查应用程序是否存在潜在的mmory泄漏?
要检查它,您可以例如旋转设备几次并检查垃圾收集器的行为方式。你应该像GC _...释放211K,71%免费300K / 1024K,外部0K / 0K,几乎每次旋转时你的LogCat暂停1ms + 1ms。注意这部分的变化:300K / 1024K。如果你没有内存泄漏,第一部分应该增长,然后在几个GC之后变小。如果你有内存泄漏,它会增长并增长到OOM错误。
Check out我关于内存泄漏的另一个答案。
如果你确定没有泄漏并且你在Honeycomb上运行,你可以增加你的应用程序可访问的堆大小:android:largeHeap="true"
但它&#39 ;只有当你处理一些huuuge位图或视频时,才推荐使用so don't overuse it。