Android Drawables内存泄漏

Android Drawables内存泄漏,android,memory-leaks,drawable,Android,Memory Leaks,Drawable,我使用了几个大的抽屉,我不知道如何管理内存泄漏。 我跟踪了应用程序的堆大小,它不会停止增长(作为分配的内存) 尤其是“字节数组(byte[])”类型,它不断增长,从不减少。(在Eclipse上的DDMS堆视图中) 我的应用程序由一个使用片段的活动组成。 这些碎片显示了几个大的图像。 我尝试将drawables回调设置为null,将drawables设置为null,在我弹出一个片段时清除我的易失性缓存(这可以防止我的应用程序执行太多的磁盘IO),但堆从未减少 事实上,每次我打电话: createF

我使用了几个大的抽屉,我不知道如何管理内存泄漏。 我跟踪了应用程序的堆大小,它不会停止增长(作为分配的内存)

尤其是“字节数组(byte[])”类型,它不断增长,从不减少。(在Eclipse上的DDMS堆视图中)

我的应用程序由一个使用片段的活动组成。 这些碎片显示了几个大的图像。 我尝试将drawables回调设置为null,将drawables设置为null,在我弹出一个片段时清除我的易失性缓存(这可以防止我的应用程序执行太多的磁盘IO),但堆从未减少

事实上,每次我打电话: createFromResourceStream(context.getResources(),value,新文件输入流(f),f.getName(),opts); 堆起来了。如何释放内存


谢谢

当Java在内存中发现代码引用的对象时,会发生内存泄漏,这会阻止垃圾收集器释放此内存。Android中的一个常见原因是引用活动上下文而不是应用程序上下文。确保您的上下文引用了应用程序(即使用
getApplicationContext
而不是使用
this
)。检查此项了解有关内存泄漏的解释,并检查此项。

问题似乎已得到回答,但Romain Guy的帖子似乎与获取更多信息相关:

显然,如果您(例如)通过使用setBackgroundDrawable*(从而将drawable附加到视图)将drawable设置为文本视图的背景图像,然后更改方向(销毁活动并重新绘制UI),drawable仍然可以访问旧活动(在旧活动销毁后),从而造成内存泄漏


*(作为旁注-setBackgroundDrawable已被删除)

我引用的是应用程序上下文,而不是活动上下文,你认为问题在于我的片段从未被破坏,它们会泄漏吗?也许,请查看我回答中关于如何使用SDK内存分析工具(MAT)的视频为了找到泄漏的对象!我解决了我的问题!事实上,我的片段保存在内存中,是我的静态易失性缓存保存了它。我真的不知道它为什么会有这种行为。我在创建片段时引用了一个DrawableManager,它有几种方法可以从磁盘或通过网络检索Drawables。当在我的视图中,它将其保存在一个静态HashMap中(以便在我的其他片段中重用此缓存)。我只是将我的HashMap设置为非静态(不能在片段之间重用易失性缓存)。我不知道为什么我的片段会保存在内存中……但即使在API 24中,setBackgroundDrawable仍然在内部由setBackground调用。:)