我有一个程序从库中加载一个位图(通过调度结果的意图),然后显示图像。然后,在离开显示图像的活动时,我会调用bm.recycle()
。但这似乎没有回收位图?我知道这是因为帖子中描述的问题:android bitmap out-of-memory error after getting same image twice in a row。
这个问题具体如本标题所述:为什么onDestroy不回收位图? (我只提供某些背景的链接而不是分心)
这是我的onDestroy:
@Override
protected void onDestroy() {
super.onDestroy();
unbindDrawables(findViewById(android.R.id.content).getRootView());
System.gc();
myImage.recycle();
myImage = null;
}
答案 0 :(得分:3)
你可能在某个地方有一个你忘了释放的参考资料。另请参阅this answer关于如何在Android中找到内存泄漏类/活动。我相信它会帮助你快速找到泄漏记忆的地方。
还要记住,你必须自己释放记忆。回调onDestroy()
不适合你。
首先,您需要安装MAT plugin。重新启动后,单击转储HPROF文件:
经过一段时间约30秒。您将看到一个对话框,您可以单击完成。比你得到这个观点:
在此处,您左键单击最大部分并过滤并使用传出引用。然后你在这里得到这个观点:
在这里,您可以看到我错过了删除ContentManager中的项目,其中有几项项目存储在我的待处理 HashMap
中。
答案 1 :(得分:2)
查看Android Activity Lifecycle,其中显示了应该使用哪些方法来创建和释放资源。它显示onCreate()
的相应功能不一定是onDestroy()
,因为开发人员不知道Android操作系统何时会调用onDestroy()
。
答案:
因此,在您的特定情况下,您可以recycle()
免费或Bitmap
onStop()
onDestroy()
,而不是onPause()
。
<强>的onPause()/的onResume()强>:
此外,最好在onResume()
中释放资源,然后在相应的方法Bitmap
中重新创建它们。
inSampleSize和OutOfMemoryError :
您还应确保使用BitmapFactory.Options.inSampleSize尽可能少地打开OutOfMemoryError
张图片,以减少收到inSampleSize
的可能性。此站点上有许多示例演示{{1}}的使用。这只是其中之一:Resize picture into according to textivew's size
Android活动生命周期: