Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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 OutOfMemoryError-使用位图中断堆大小_Android_Android Memory - Fatal编程技术网

Android OutOfMemoryError-使用位图中断堆大小

Android OutOfMemoryError-使用位图中断堆大小,android,android-memory,Android,Android Memory,在我的应用程序主屏幕加载了几次之后,我收到了一个OutOfMemoryError异常。该应用程序加载有关某个位置的数据和背景图像。有几个选项可供选择,在选择了5-6个不同的位置后,堆超过192MB,我得到了我的错误。我相信问题在于我对位图的使用不好 我的代码很长而且不清楚,因此我将给出一个示例,希望有人能帮助我,因为我认为我没有掌握有关图像内存管理的基本知识(我已经阅读了文档并进行了广泛的搜索,我希望在理想情况下能与其他人就此进行交流) 我有一个带有5个条件的if,每个条件返回一个不同的图像。

在我的应用程序主屏幕加载了几次之后,我收到了一个OutOfMemoryError异常。该应用程序加载有关某个位置的数据和背景图像。有几个选项可供选择,在选择了5-6个不同的位置后,堆超过192MB,我得到了我的错误。我相信问题在于我对位图的使用不好

我的代码很长而且不清楚,因此我将给出一个示例,希望有人能帮助我,因为我认为我没有掌握有关图像内存管理的基本知识(我已经阅读了文档并进行了广泛的搜索,我希望在理想情况下能与其他人就此进行交流)


我有一个带有5个条件的if,每个条件返回一个不同的图像。 我将图像转换为位图,并将其设置为主布局的新可绘制源

然后我再做一次,相同的功能,但不同的位置,不同的图像


在这样做了几次之后,加载的所有图像似乎都保留在内存中,并将其阻塞,从而导致错误。为了尽量简单起见,在将这些不同的图像加载到我的版面背景中之前,我应该执行哪些步骤来防止此问题?

您必须回收位图,您不再使用了。确保您同时持有的位图实例数量非常有限,并且每次使用完位图时都调用其“recycle()”方法


您可以在这里找到更多信息:&

当不再有对位图的引用时,dalvik不应该处理这个问题吗?但是什么时候应该调用循环。回收确实不再是必要的了。我曾尝试将它们全部设置为null,甚至在活动暂停、恢复等时手动调用GC,但没有真正的更改。@Twenty100,根据上面链接中的信息,在Android 2.3.3(包括)之前需要显式循环调用,但在更高版本中不需要。可能是他们改进了一个垃圾收集算法。至于回收时间-建议在不使用位图实例时尽快调用回收。另请参见此处有关位图缓存的有用阅读:感谢Densis提供的信息。但是,根据我的例子,如果我只有一个背景,其中加载了一个位图,每次都会覆盖,那么我什么时候才能尝试回收位图呢?因为我使用的是相同的函数,具有相同的名称,并且我可以看到覆盖它(尽管显然它不是这样工作的)。所以,当我在位图mybitmap中获得第二个位图并更新了布局背景后,如何删除第一次创建的位图?@Twenty100。你说的覆盖是什么意思?是否每次加载背景时都要创建新的位图类实例?如果是这种情况,那么您需要在创建新实例之前,为已经存在的实例调用“recycle()”。完成此操作后,您可以将其替换为新背景的较新版本。192MB的容量远远大于许多手机的容量。通常情况下,您需要降低到~32MB。幸运的是,这些设备的屏幕密度通常较低,因此您不必在屏幕上添加那么多像素。这是处理位图的有用资源: