OnDestroy不会破坏在OnCreate中创建的对象

时间:2013-04-26 19:36:44

标签: android image bitmap android-lifecycle activity-lifecycle

我有一个程序从库中加载一个位图(通过调度结果的意图),然后显示图像。然后,在离开显示图像的活动时,我会调用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;
}

2 个答案:

答案 0 :(得分:3)

你可能在某个地方有一个你忘了释放的参考资料。另请参阅this answer关于如何在Android中找到内存泄漏类/活动。我相信它会帮助你快速找到泄漏记忆的地方。

还要记住,你必须自己释放记忆。回调onDestroy()不适合你。


首先,您需要安装MAT plugin。重新启动后,单击转储HPROF文件

Device controls

经过一段时间约30秒。您将看到一个对话框,您可以单击完成。比你得到这个观点:

Dump result

在此处,您左键单击最大部分并过滤并使用传出引用。然后你在这里得到这个观点:

在这里,您可以看到我错过了删除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活动生命周期

Android Activity Lifecycle