Android 位图、回收和堆碎片

2024-03-13

我有一个应用程序大量使用从 SD 卡读取的位图。我 99% 确信如果不回收这些,我的应用程序永远不会被破坏。它们都被分配到 LRU 缓存(公共集合)中,当它们从 LRU 缓存中清除时,该缓存会回收它们,并且我回收剩余的onDestroy().

尽管如此,我仍然有问题。如果我多次启动/停止/启动/...我的应用程序,我总是会遇到内存不足错误。

我对此的理论是,这与 Android 的非压缩堆有关。经过几次运行后,堆已经变得足够碎片,因此尽管有大量可用内存,但没有足够大的连续块来加载位图。无论如何,这就是理论。

我一直在通过终止我的进程来“解决”这个问题onDestroy() (android.os.Process.killProcess())。这解决了问题,但引入了它自己的其他问题,因为我还有其他线程和服务需要完成,并且很好地等待所有这些是不切实际的。更不用说我当然明白这只是一个非常糟糕的做法。

我已阅读有关此主题的所有帖子等,但没有看到好的解决方案。我在用着Thumbnails.getThumbnail(),所以我已经在使用图像的缩小版本。进一步对它们进行二次采样会导致图像质量非常差。

我保留了 8 个“迷你”缩略图和 36 个“微型”缩略图的缓存,因此内存中一次不会有更多的缩略图。这些最多应该在几兆以内。

接下来我可以尝试什么?


你说你回收它们onDestroy(),但也许你应该回收它们onPause()?我在切换方向时遇到了一些内存不足问题,并且通过在中进行回收解决了该问题onPause().

只是一个想法。不确定这是否能解决您的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 位图、回收和堆碎片 的相关文章

随机推荐