【发布时间】:2014-01-17 05:35:07
【问题描述】:
我的适配器中有一个“内存泄漏”(引用将在后面解释)。我目前正在使用嵌套片段来托管 viewpager。
我的设置如下:
1. Activity(承载 Fragment A 的空 Activity)
2. 片段 A - 使用 Fragmentstatepageradapter 托管 viewpager 的片段。每个浏览器页面都承载片段 B。
3. Fragment B - 一个包含 imageview 的片段。
一切都很好,除非发生配置更改。监控堆,似乎每次旋转都会增长 100 kb。手动 GCing 不会释放内存。
我尝试过的事情:
1. 将 Fragment B 替换为空白片段 - 会出现同样的问题,因此不是导致问题的 imageview。
2. 删除片段 A 和 B 并旋转活动。没有发生内存泄漏,所以它不是活动。
3. 在任何方向改变之前和旋转大约 50 次后使用 MAT 来获取堆。 MAT 显示 1 个主要嫌疑人是我的适配器类。它显示了 7MB 的保留堆(非常小的浅堆)的观察者,如下所示:
array java.util.ArrayList @ 0x42079938 24 7,000,832
.\mObservers android.database.DataSetObservable @ 0x42053508 16 7,000,848
..\mObservable com.example.main.Adapter@ 0x4205a048 40 7,001,416
为什么我在片段中使用 viewpager:
1. 我想通过设置 setretaininstance(true) 来保持适配器的状态和与 viewpager 相关的其他变量。
2. 配置更改后,我没有重新创建适配器,而是使用旧适配器附加到 viewpager。
3.如果我不重用旧适配器而是在配置更改后创建新适配器,内存泄漏就会消失。
4.我关闭活动并返回上一个活动后,内存泄漏也消失了。
有什么想法吗?将不胜感激。
谢谢, JC
【问题讨论】:
标签: android memory-leaks android-viewpager fragmentstatepageradapter