0

我得到随机溢出异常导致我的应用程序内存异常。内存溢出布局异常

我有7个片段(难度)活动,通过按钮启动自己的活动。每个片段都有一个带有30个按钮(水平)的滚动视图。 我已经设置好了,这样我就可以滑过每个片段,片段占据了整个屏幕。

偶尔当我滑动几次,然后从一组30个随机按钮中选择一个,它会崩溃。它会尝试加载活动,并在随机行上发生内存异常并发生膨胀异常。该行总是落在xml文件中的imageView或imageButton上。加载的活动是imageViews和imageButtons的网格。

我没有得到太多的例外,但它是我想解决的问题。我看过很多其他的内存异常问题,尽管没有人帮助过我。我做了一次内存分析测试,没有显示出任何不寻常的东西。

我认为imageViews和imageButtons使用的内存太多,尽管我只有一次打开一个活动。

+0

嵌套布局可能会导致。那里有多少层? – wisemann

回答

1

你已经提到它总是落在ImageView和ImageButton上 - 这是解决这个问题的线索。你会得到OOM,因为这个视图的背景资源具有很高的分辨率,并占用大量的内存。尝试降低此图像的分辨率。

此外,你已经提到你有一个滚动视图,这意味着你保存在内存中的每30个项目。可能你最好把它改成由适配器支持的RecyclerView。

+0

因此,将图像更改为较低的分辨率工作....排序。除非我真的试图导致它崩溃几乎不存在。大多数用户不会将它推到极限。虽然,我希望它完全消失。使用scrollView是因为我想让我的应用可以通过android 3.0或更高版本访问。使用recyclerView将移动到android 5.0。他们的方式可以减少scrollView的内存需求,而无需使用recyclerView? – RhysBailey21

+0

RecyclerView是支持库的一部分,可从SDK 7及更高版本的API访问,这意味着您在使用RecyclerView时具有向后兼容性。自SDK v1以来,还有一些适配器支持的视图,如ListView,GridView等。所以这不是喜欢ScrollView比RecyclerView –

2

这是因为您的图像正在加载。当您加载图像并且在页面上移动并查看其他图像时,堆会增加。随着您继续查看随机图像的过程,堆增长得更快,直到您的应用崩溃。这就像在玻璃桌子上堆书。您可以移动(缓存)书籍(图片)或玻璃(应用程序)中断。您应该使用图像加载器来加载图像。

https://github.com/nostra13/Android-Universal-Image-Loader

+0

我明白你的意思。非常好的描述。虽然,“刷新”每一项活动的变化不是更好吗? – RhysBailey21

+0

不,因为您在做这项工作而不是图片加载程序。少工作是好事。我已经看到0与图像加载器内存不足的错误。我喜欢转向其他更具活力的方面,也许你喜欢这项工作。 :) – SmulianJulian

0

刚刚有同样的问题,我想简化所有的事情在这里说:

简单:减少您的图片大小。

不要使用1080X1920图片...它的分辨率太高。

这样的图像,即使压缩,部署时将捕获大约1080X1920X4B = 8.2MB(GPU必须将其部署到它的全部原始分辨率......这就是为什么压缩无助于减少所需内存大小.. 。)和这个我我们正在谈论的内存..

把瘸子或Photoshop和向下缩放图像,比如说,1/4:540X960,你不会觉得区别..相信我,已经在那里了。

请注意图像和视频的内存消耗。

希望这有助于

詹姆斯