Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OnDestroy不销毁在OnCreate中创建的对象_Android_Image_Bitmap_Android Lifecycle_Activity Lifecycle - Fatal编程技术网

Android OnDestroy不销毁在OnCreate中创建的对象

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

我有一个程序,从gallery加载一个位图(通过发送结果意图),然后显示图像。然后,当离开显示图像的活动时,我调用
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()
a
Bitmap
,必须确保在重新创建之前不要再次使用它。使用
isRecycled()
确定是否尝试访问已回收的
位图。