2012-09-15 93 views
7

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

它特别是长大而不会减少的“字节数组(byte [])”类型。 (在Eclipse上的DDMS Heap视图中)

我的应用程序由一个使用片段的活动组成。 这些片段正在显示几张大图片。 我试图将drawables回调设置为null,将drawables设置为null,当我弹出一个片段但堆不会减少时清除我的易失性缓存(这会阻止我的应用程序执行太多的磁盘IO操作)。实际上,每次我调用: Drawable.createFromResourceStream(context.getResources(),value,new FileInputStream(f),f.getName(),opts); 堆长大。我如何释放记忆?

谢谢!

回答

6

当Java找到内存中由代码引用的对象时,会发生内存泄漏,这会阻止垃圾收集器释放此内存。 Android中的一个常见原因是引用Activity上下文而不是Application上下文。请确保您的上下文引用的应用程序(即使用getApplicationContext而不是使用this选中此video对内存泄漏的解释,并检查该question

+0

我引用了应用程序上下文,而不是活动场景,你认为问题是,我的片段永远不会被销毁,他们泄露? – abecker

+0

也许,请在我的答案中查看视频,了解如何使用SDK内存分析工具(MAT)查找正在泄漏的对象 –

+1

嘿!我解决了我的问题!实际上,我的片段被保存在内存中,并且它是我的静态易失性缓存。我不知道为什么它有这种行为。我创建了一个DrawableManager,当我创建一个片段时,它有多种方法从磁盘或网络中检索Drawable。当它将一个视图传递给我的视图时,它将它保存在一个静态HashMap中(以便在我的其他片段中重用此缓存)。我只是让我的HashMap没有静态(不能重用片段之间的易失性缓存)。我不知道为什么我的碎片被留在记忆中。 – abecker

2

这个问题似乎是回答,但是在一个帖子中罗曼盖伊似乎有关,以获得更多信息:Avoiding Memory Leaks

显然,如果你(例如)通过使用setBackgroundDrawable *(因此将drawable连接到视图)将一个drawable作为背景图像设置为文本视图,则更改方向(销毁Activity并重绘UI)drawable仍然可以访问旧的activity(在旧的activity被销毁后),从而产生内存泄漏。

*(作为一个侧面说明 - setBackgroundDrawable一直deprecated since API level 16

+0

...而setBackgroundDrawable即使在API 24中仍由setBackground在内部调用。:) –