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