Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.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
Java 如何通过多个活动减少内存分配_Java_Android_Android Activity_Bitmap_Out Of Memory - Fatal编程技术网

Java 如何通过多个活动减少内存分配

Java 如何通过多个活动减少内存分配,java,android,android-activity,bitmap,out-of-memory,Java,Android,Android Activity,Bitmap,Out Of Memory,比如说,我有一个关于电影/演员的应用程序。有一个带有电影(或演员)细节的活动,在这个活动中,我有带有3个片段的浏览页面:A,B和C。每个片段都有我用毕加索和爱奥尼从网上下载的图像 我使用位图,执行转换,将它们调整到ImageView的大小,这样它们就不会占用太多内存。但我不会把它们保存在任何地方,我不需要它们被保存 我在每个片段中都有大量的图像(我使用回收器gridview)。片段B和C具有这些带有电影或演员的网格视图,其中,单击项目打开具有相同片段和新项目列表的新详细信息活动。因此,每次单击G

比如说,我有一个关于电影/演员的应用程序。有一个带有电影(或演员)细节的活动,在这个活动中,我有带有3个片段的浏览页面:ABC。每个片段都有我用毕加索和爱奥尼从网上下载的图像

我使用位图,执行转换,将它们调整到ImageView的大小,这样它们就不会占用太多内存。但我不会把它们保存在任何地方,我不需要它们被保存

我在每个片段中都有大量的图像(我使用回收器gridview)。片段B和C具有这些带有电影或演员的网格视图,其中,单击项目打开具有相同片段和新项目列表的新详细信息活动。因此,每次单击GridView中的项目时,我都可以深入地打开新活动

因此,我迟早会达到OOM,这取决于设备的RAM数量。(我无法在2gb内存的真实手机上重现这一点,但512mb应用程序在第5或第6次打开活动时崩溃)。

每次打开活动时,分配的内存量都会增加。只有当我回到之前的状态时,它才会减小

所以问题是:我应该做些什么来减少内存使用?我是否应该重用已经存在的活动?我不知道该如何回到以前的电影。是的,一切都有可能,但我不想让它变得更复杂或缓慢

我已尝试完成以前的活动。或者在onStop方法中删除并回收每个imageview中的位图。这两种方法都不好,因为我必须回去看看数据和图像。不要每次都下载它们


我希望你们能给我一个主意,伙计们。由于我是java和android开发新手,我可能遗漏了一些东西。

使用缓存。创建固定大小的LRUCache并将所有图像放置在缓存中。当您需要显示图像时,请检查其是否在缓存中,如果没有,请从internet下载。使用此解决方案,您将永远不会在图像上使用超过缓存大小的内容


如果需要,可以考虑2级(内存/磁盘)缓存。下载映像时,请将其保存到磁盘。使用如上所述的LRUCache。当映像不在缓存中时,检查其是否在磁盘上,如果在磁盘上,则从那里读取(并将其放入内存缓存)。如果它不在磁盘上,请从internet获取它。

使用缓存。创建固定大小的LRUCache并将所有图像放置在缓存中。当您需要显示图像时,请检查其是否在缓存中,如果没有,请从internet下载。使用此解决方案,您将永远不会在图像上使用超过缓存大小的内容


如果需要,可以考虑2级(内存/磁盘)缓存。下载映像时,请将其保存到磁盘。使用如上所述的LRUCache。当映像不在缓存中时,检查其是否在磁盘上,如果在磁盘上,则从那里读取(并将其放入内存缓存)。如果它不在磁盘上,请从internet获取。

为什么不缓存你的BitMPA?这正是它的用途!好吧,我想我现在明白了。到目前为止,你和Gabe Sechan帮助我理解了我应该看哪里。让它成为答案,并感谢你们很多人:)。为什么不缓存你们的BitMPA呢?这正是它的用途!好吧,我想我现在明白了。到目前为止,你和Gabe Sechan帮助我理解了我应该看哪里。让它成为答案,谢谢大家:)。是的,但如果我错了,请纠正我。如果需要,毕加索默认使用LRU和磁盘缓存。据我所知,它应该在没有任何额外代码的情况下处理任何内存问题?虽然我不确定Ion,但我还是用毕加索加载了大部分图像。或者您建议手动执行此操作,将它们缓存在onStop方法中,然后从那里加载到onStart中,例如?那么为什么我需要毕加索呢?如果你的OOM崩溃了,要么你没有正确地缓存它们,要么你在别处泄漏(在这种情况下,检查你的HPROF,寻找增加的类数)。使用库为您进行缓存的危险在于,您需要正确使用库,并且需要假定库的编写是正确的。您是否阅读过毕加索代码库以了解其缓存方式并确保正确使用?如果不是的话,盲目地认为它能为你工作就是人们如何编写有内存泄漏的蹩脚程序。好吧,我想我现在知道它是如何工作的了。到目前为止,你和AnixPasBesoin帮助我理解了我应该去哪里看。让它成为答案,谢谢大家:)。是的,但如果我错了,请纠正我。如果需要,毕加索默认使用LRU和磁盘缓存。据我所知,它应该在没有任何额外代码的情况下处理任何内存问题?虽然我不确定Ion,但我还是用毕加索加载了大部分图像。或者您建议手动执行此操作,将它们缓存在onStop方法中,然后从那里加载到onStart中,例如?那么为什么我需要毕加索呢?如果你的OOM崩溃了,要么你没有正确地缓存它们,要么你在别处泄漏(在这种情况下,检查你的HPROF,寻找增加的类数)。使用库为您进行缓存的危险在于,您需要正确使用库,并且需要假定库的编写是正确的。您是否阅读过毕加索代码库以了解其缓存方式并确保正确使用?如果不是的话,盲目地认为它能为你工作就是人们如何编写有内存泄漏的蹩脚程序。好吧,我想我现在知道它是如何工作的了。到目前为止,你和AnixPasBesoin帮助我理解了我应该去哪里看。让它成为答案吧,谢谢大家:)。