ImageViews中的活动持有内存导致内存泄漏

时间:2016-08-31 15:49:01

标签: java android memory memory-leaks

昨天当我切换到第二个活动时,我问了一个关于我的MainActivity保留内存的问题。 @CommonsWare指出我正确的方向,以确定仍然使用堆转储保留内存,但我不能让它与我的"主"设备。我拿出一个旧设备,最终通过DDMS获得堆转储(Android工作室仍然没有工作)。我分析了转储,看到我有很多仍然坚持他们的位图(可绘制资源)的ImageView。我的MainActivity上有一个片段,里面有很多按钮(以ImageViews的形式)。当我删除()那个活动时,位图引用仍然存在,所以我不得不转到该片段的onDestroy()方法并调用myImageView.setImageBitmap(null);在所有这些上面看到在加载下一个Activity时释放的内存。每次离开MainActivity时,这在我的旧设备上运行正常,但在我的" main"设备,它只能在AndroidStudio新构建后第一次运行。如果我然后关闭应用程序(甚至强行将其杀死在我的应用程序管理器中)然后返回应用程序,当我导航到我的第二个活动时,它仍然保持某些东西。但正如我在本文开头提到的那样,无论出于什么原因我无法从该设备获得堆转储以确定原因。我在这里有两个问题:

1)有没有更好的方法来释放myImageView.setImageBitmap(null)之外的内存;我昨天大部分时间都在阅读有关内存泄漏的内容,导致他们如何避免内存泄漏等等。我读了很多关于持有我的MainActivity实例的内容(上下文),这可能是罪魁祸首。我仔细检查了我的所有代码,试图找到一个可以将上下文传递给子类的地方,并且在我的DatabaseAdapter上只有一个实例,我传递了getBaseContext(),但是我将我的DBAdapter类设置为null在我的MainActivity的onStop()中。

2)为什么在我的" main"设备(三星Galaxy S7 Active)内存只在应用程序首次从Android Studio构建后释放,但在我的旧设备(One Plus Two)上,它每次都有效吗?我真的很想能够看到GS7A的垃圾堆,但是唉,它只会不会产生一个。

我尝试过的一些事情:我已经尝试将MainActivity的onStop方法上的setContentView()改为单个视图,并且不会释放内存。当我转到我的第二个活动并且没有释放内存时,我已经尝试完成()使用MainActivity ...唯一似乎释放内存的是将我的ImageViews重置为null并且遗憾的是,它在我的所有测试设备中都不一致。

这里的任何建议都将非常感谢。

0 个答案:

没有答案