Android 位图、回收和堆 fragment

标签 android

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

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

我的理论是它与 Android 的非压缩堆有关。几次运行后,堆已足够 fragment 化,因此尽管有足够的可用内存,但没有足够大的连续 block 来加载位图。无论如何,这就是理论。

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

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

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

接下来我可以尝试什么?

最佳答案

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

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

关于Android 位图、回收和堆 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6349943/

相关文章:

java.lang.NoClassDefFoundError : android. support.v7.app.AppCompatDelegateImplV14 在Android Studio

Android gradle - 如何远程访问 keystore

java - 禁用警告变量可能尚未初始化?

java - 说话按钮不起作用

android - Canvas /旋转/屏幕方向

android - onTextContextMenuItem 不会在自定义菜单项上调用

android - 我不断收到 configChanges : String types not allowed error. 即使目标 API 设置为 13

android - 使用 Firebase 和 ChildEventListener 时如何在方向更改后保留 RecyclerView 的位置?

android - OnSuccess 响应不会在 Kotlin 中使用改造

android - 导入任何项目后如何解决 Eclipse 中的此错误