相关疑难解决方法(0)

Android应用程序内存不足问题 - 尝试了一切但仍然不知所措

我花了整整4天时间尽我所能来弄清楚我正在开发的应用程序中的内存泄漏,但事情很久以前就停止了.

我正在开发的应用程序具有社交性,因此请考虑配置文件活动(P)并列出包含数据的活动 - 例如徽章(B).您可以从配置文件跳转到徽章列表,转到其他配置文件,其他列表等.

所以想象一下这样的流程P1 - > B1 - > P2 - > B2 - > P3 - > B3等.为了保持一致性,我正在加载同一个用户的配置文件和徽章,所以每个P页面是相同的,所以是每个B页面.

这个问题的一般要点是:在导航了一下之后,根据每个页面的大小,我在随机位置得到了一个内存不足的例外 - 位图,字符串等 - 它似乎并不一致.

在做了一切可以想象的事情来弄清楚为什么我的内存不足之后,我什么也没想出来.我不明白的是,如果Android在加载时耗尽内存而不是崩溃,那么为什么Android不会杀死P1,B1等.如果我通过onCreate()和onRestoreInstanceState()返回它们,我会期望这些早期活动会死亡并复活.

更别说这个 - 即使我做P1 - > B1 - >返回 - > B1 - >返回 - > B1,我仍然会崩溃.这表明某种内存泄漏,即使在转储hprof并使用MAT和JProfiler后,我也无法查明它.

我已禁用从Web加载图像(并增加了加载的测试数据以弥补它并使测试公平)并确保图像缓存使用SoftReferences.Android实际上试图释放它所拥有的一些SoftReferences,但就在它崩溃内存之前.

徽章页面从Web获取数据,从BaseAdapter将其加载到EntityData数组中并将其提供给ListView(我实际上使用的是CommonsWare的优秀MergeAdapter,但在此Badge活动中,实际上只有1个适配器,但我无论哪种方式都想提到这个事实).

我已经完成了代码并且无法找到任何可能泄漏的内容.我清除并取消了我能找到的所有内容,甚至是System.gc()左右,但应用程序崩溃了.

我仍然不明白为什么堆栈上的非活动活动不会被收获,我真的很想知道这一点.

在这一点上,我正在寻找任何提示,建议,解决方案......任何有用的东西.

谢谢.

lifecycle android out-of-memory android-activity

87
推荐指数
3
解决办法
4万
查看次数

异步下载适配器中的位图,重点介绍Bitmap.recycle()

有人能告诉我如何为异步制作一个好的机制.下载用于ListView/GridView的图像?有许多建议,但每个只考虑典型要求的一小部分.

下面我列出了一些合理的因素(要求或要考虑的因素),我和我的同事们不能立刻满足.
我不是要求代码(虽然它是受欢迎的),只是一种管理所描述的位图的方法.

  1. 没有重复的下载程序或位图
  2. 取消下载/分配不再需要或可能自动删除的图像(SoftReference等)
  3. 注意:适配器可以有多个视图用于相同的ID(对getView(0)的调用非常频繁)
  4. 注意:无法保证视图不会丢失而不是回收(考虑List/GridView调整大小或按文本过滤)
  5. 视图和数据/逻辑的分离(尽可能多)
  6. 不为每次下载启动单独的线程(UI的可见减速).使用队列/堆栈(BlockingQueue?)和线程池,或某些....但需要结束,如果活动停止.
  7. 清除位图与列表/网格中的当前位置相距足够远,优选仅在需要存储器时
  8. 在要丢弃的每个Bitmap上调用recycle().
  9. 注意:外部存储器可能无法使用(无论是在任何时候还是在所有时间),如果使用的话,应该尽快清除(仅限于此处下载的图像)(考虑Android的Activity destroy/recreation)
  10. 注意:可以更改数据:删除条目(多选和删除)并添加(在后台线程中).已经下载的位图应该保留,只要它们链接的条目仍然存在.
  11. setTextFilterEnabled(true)(如果基于ArrayAdapter的机制,将影响数组索引)
  12. 可用于ExpandableList(影响缩略图的显示顺序)
  13. (可选)下载Bitmap时,只刷新相关的ImageView(列表项可能非常复杂)

请不要发布个别积分的答案.我的问题是,我们越是专注于某些方面,其他人就越模糊,海森堡就像.
每个都增加了难度维度,特别是Bitmap.recycle,需要在操作和Activity销毁期间调用(请注意onDestroy,甚至onStop可能不会被调用).
这也排除了依赖SoftReferences.
这是必要的,或者我甚至在使用任何数量的gc,sleep(20s,偶数),在try-catch(以强制受控的OutOfMemory)之后产生和大量数组分配后得到OutOfMemoryError.
我已经重新采样了Bitmaps.

android lazy-loading bitmap adapter recycle

7
推荐指数
1
解决办法
1501
查看次数