让我们说,我有一个关于电影/演员的应用程序。有一个活动与电影(或演员的)细节,在这个活动中,我有 viewpager有3个片段: A , B 和 C 。每个片段都有我使用Picasso和Ion从互联网上下载的图像。
我使用位图,执行转换,将其大小调整为图像视图的大小,因此它们不会占用大量内存。但我不会把它们保存在任何地方,我也不需要它们来保存。
我在每个片段中都有大量图片(我使用的是recycler gridview)。片段B和C具有电影或演员的这些网格视图,其中点击项目打开新的详细信息活动,具有相同的片段和新的项目列表。因此,每次单击gridviews中的项目时,我都可以非常深入地开启新活动。
结果,我迟早会到达OOM,取决于RAM设备的数量。 (我无法在具有2GB内存的真实手机上重现这一点,但在第5或第6次打开的活动中有512mb应用程序崩溃)。
每次活动开放时分配的内存量都会增加。它只会减少然后我会回到之前的那些。
所以问题是:我该怎么做才能减少内存使用?我应该重用已经存在的活动吗?我不知道如何管理回到之前的电影。是的,一切皆有可能,但我不想让它更复杂或更慢。
我试图完成以前的活动。或者在onStop方法中删除和回收每个imageview中的位图。两种方式都不是很好,因为我必须以某种方式返回并查看数据和图像。并且不要每次都下载它们。
我希望你能给我一个想法,伙计们。由于我是java和android开发的新手,我可能会遗漏一些东西。
答案 0 :(得分:2)
使用缓存。创建固定大小的LRUCache并将所有图像放在缓存中。当您需要显示图像时,请检查它是否在缓存中,如果没有从Internet下载。使用此解决方案,您永远不会在图像上使用超过缓存的大小。
如果需要,可以考虑2级(内存/磁盘)缓存。下载图像时,将其保存到磁盘。使用上面的LRUCache。当映像不在缓存中时,检查它是否在磁盘上,如果是,则从那里读取(并将其放入内存缓存中)。如果它不在磁盘上,则从互联网上获取它。