Android OnDestroy不销毁在OnCreate中创建的对象
我有一个程序,从gallery加载一个位图(通过发送结果意图),然后显示图像。然后,当离开显示图像的活动时,我调用Android OnDestroy不销毁在OnCreate中创建的对象,android,image,bitmap,android-lifecycle,activity-lifecycle,Android,Image,Bitmap,Android Lifecycle,Activity Lifecycle,我有一个程序,从gallery加载一个位图(通过发送结果意图),然后显示图像。然后,当离开显示图像的活动时,我调用bm.recycle()。但这似乎并没有回收位图?我之所以知道这一点,是因为这里的帖子中描述的问题: 这个问题在当前的标题中特别指出:onDestroy为什么不回收位图?(我只提供某些上下文的链接,而不是作为干扰) 这是我的简历: @Override protected void onDestroy() { super.onDestroy(); unbindDrawa
bm.recycle()
。但这似乎并没有回收位图?我之所以知道这一点,是因为这里的帖子中描述的问题:
这个问题在当前的标题中特别指出:onDestroy为什么不回收位图?(我只提供某些上下文的链接,而不是作为干扰)
这是我的简历:
@Override
protected void onDestroy() {
super.onDestroy();
unbindDrawables(findViewById(android.R.id.content).getRootView());
System.gc();
myImage.recycle();
myImage = null;
}
你可能在某个地方有一个你忘记免费提供的参考资料。另请参见如何在Android中查找内存泄漏类/活动。我相信这会帮助你快速找到你的记忆泄露的地方 还要记住,你必须自己释放记忆。回调
ondestory()
不会为您执行此操作
首先,您需要安装。重新启动后,单击转储HPROF文件: 一段时间后大约30秒。您将获得一个对话框,可以在其中单击finish。然后您会看到以下视图: 在这里,您可以用鼠标左键单击最大的部分,然后过滤带有传出引用的。然后您可以在此处看到此视图: 在这里,您可以看到我没有删除ContentManager中的项目,其中有几个项目存储在挂起的
HashMap
中。请查看,其中显示了创建和释放资源应使用的方法。它表明onCreate()
对应的函数不一定是onDestroy()
,因为开发人员不知道Android操作系统何时调用onDestroy()
答案是:
因此,在您的特定实例中,您可以在onStop()
中释放或recycle()
您的Bitmap
,而不是在onDestroy()
中
onPause()/onResume():
此外,更好的做法是在onPause()
中释放资源,然后在相应的方法onResume()
中重新创建它们
输入采样和输出内存错误:
您还应确保使用打开的位图
图像尽可能小,以减少收到OutOfMemoryError
的可能性。本网站上有许多示例演示了inSampleSize
的使用。以下是其中之一:
Android活动生命周期:
也许您只回收最后创建的位图。使用完位图后,您应该循环使用它。使用它是否意味着在视图中将其显示为setImageBitmap或setDrawable之后立即使用它?不完全是这样,您可能会遇到异常。我想说的是,不要等到你的活动进入onDestroy(),如果位图对你不再有用,你可以回收它。啊,我一直在读一些博客,它们是onCreate/onDestroyIncorrect配对的。onCreate()的反面实际上是onDestroy()——这些方法涉及生命周期。onStart()的反面是onStop(),这是一对涉及(至少部分)屏幕可见性的方法。您的困惑似乎来自于应用程序在没有调用onDestroy()的情况下被终止的非典型路径。在没有调用onDestroy()的情况下,这是因为进程已终止,此时开发人员编写的代码不需要也没有机会释放任何资源。如果绑定器IPC已正确用于通知远程对象死亡,则应释放与死进程中的资源链接的其他进程中的远程资源。类似地,操作系统级资源应该通过进程死亡本身得到释放。当我将onDestroy更改为onPause时,我在
unbindDrawables(findViewById(android.R.id.content).getRootView())处得到一个nullPointerException
。异常显示为E/AndroidRuntime(3430):java.lang.RuntimeException:无法暂停活动…
我猜它指的是getRootView。是否调用onPause()
[错误]?onPause()
现在调用super.onPause()
[good]还是super.onDestroy()
[bad]?此外,一旦您recycle()
aBitmap
,必须确保在重新创建之前不要再次使用它。使用isRecycled()
确定是否尝试访问已回收的位图。