所以我想我已经找到了内存泄漏的根源。基于这篇文章:http ://android-developers.blogspot.ca/2009/01/avoiding-memory-leaks.html有一个静态位图可绘制并将其设置在 ImageView 上是不好的。这是因为,一旦设置 (imageView.setImageBitmap(bitmap)),ImageView 本身就被设置为位图上的回调。因此,在旋转时,Bitmap,因为它是静态的,所以保留并且仍然包含对前一个 ImageView 的回调,它还具有对前一个活动的引用。因此之前的活动不会被破坏!
我相信我有类似的问题,但这不是由于静态变量,而是 Singleton ImageCache 类。基本上,这个 ImageCache 在应用程序运行时是活动的,并使用 getInstance(Context context) 调用。存储在其中的每个位图也会在某个时间点设置在 ImageView 上。
内存泄漏:当屏幕旋转时,仍然在内存中的位图有一个回调到之前的 Image View。因此,先前的活动不会被破坏。但是,我不想回收和销毁此位图,因为它可能在应用程序的其他地方使用。我认为我需要做的是从 Bitmaps 回调集中删除正在销毁的特定 ImageView。我该怎么做呢?还是我的分析完全错误?感谢帮助!
更新:
所以看起来问题的根源是我活动中的 ViewPager 。基本上,我有一个片段 ViewPager,已添加到我的 ListView 的标题中。也就是说,我称mListView.addHeaderView(mViewPager);
这工作正常,直到我旋转屏幕。旋转屏幕后,我注意到碎片正在泄漏。例如,我在 ViewPager 中使用 3 个片段启动应用程序。当我旋转时,我注意到原来的 3 个被重新创建,另外三个被创建。但是,这对用户是不可见的!由于某种原因,前三个被保留在后台。我可以通过跟踪片段的onPause()
和调用来看到这一点。onCreate()
知道为什么会这样吗?
这是一些示例代码:
mStatusView = inflater.inflate(
R.layout.header,
(ViewGroup) getActivity().findViewById(
R.id.list_header));
mListView.addHeaderView(mStatusView, null /*data*/, false /*isSelectable*/);
mListView.setSelectionAfterHeaderView();
....
mHeaderPager = (ScrollableViewPager) mStatusView.findViewById(R.id.header_pager);
在上面的代码中,mStatusView 是一个完整的视图,还有其他元素。mHeaderPager 是 mStatusView 中的 ViewPager。