我有一个使用recyclerView的活动,并且每个项目的视图都有一个图像。
我在Destroy上使用了垃圾收集器GC(),如下所示
recyclerView= null;
adapter=null;
Runtime.getRuntime().gc();
时会发生以下情况
<小时/> 当我开始另一个使用Picasso从远程主机加载图像的活动它说
java.lang.OutOfMemoryError: Failed to allocate a 94784012 byte allocation with 4194304 free bytes and 87MB until OOM
我找到了一个答案,可以帮助我克服 OutOfMemoryError 应用程序的增加堆大小但是我仍然希望释放并确保释放Activity占用的内存而不是为app.Thanks提前增加堆大小,请帮助完成该任务。
答案 0 :(得分:3)
那里不需要您在onDestroy
方法中使用的代码。如果调用destroy,那么你的acitivity将从堆栈中删除,并且对于gc而言是免费的,其中包含仅由活动引用的所有资源。
OnDestroy
并不总是被调用,这就是为什么根本不能调用你的方法的原因。您可以尝试在活动中显式调用finish()
,然后调用onDestroy并查看情况将如何更改。但是活动将从堆栈中删除。
同样手动调用gc应该是糟糕的风格。在Android上,系统几乎总是知道何时是进行垃圾收集的最佳时间。大多数情况下,活动完成垃圾收集会自动触发。
我会首先考虑调整从Picasso
获得的图像的大小,因为即使有空间,它们也可能因为堆积而过大。
查看调整选项link
的大小答案 1 :(得分:1)
似乎问题与巨大的图像有关,尝试不将图像保留在内存中,只按需加载图像(使用一些缓存策略)
尝试用滑行替换毕加索。 Glide提供更好的内存性能https://medium.com/@multidots/glide-vs-picasso-930eed42b81d
尝试使用最接近的上下文加载所有图像 https://stackoverflow.com/a/32887693/6193843