由于Android上的ImageCache内存泄漏而引发OutOfMemoryException

时间:2013-09-24 18:07:55

标签: java android memory-leaks bitmap image-loading

所以我认为我发现了内存泄漏的来源。基于这篇文章:http://android-developers.blogspot.ca/2009/01/avoiding-memory-leaks.html有一个静态Bitmap可绘制并在ImageView上设置它是很糟糕的。这是因为,一旦设置(imageView.setImageBitmap(位图)),ImageView本身就会在Bitmap上设置为 Callback 。因此,在旋转时,Bitmap(因为它是静态的)保持并仍然包含对前一个ImageView的回调,ImageView也引用了之前的活动。因此,以前的活动不会被破坏!

我相信我有类似的问题,但这不是由于静态变量,而是Singleton ImageCache类。基本上,当应用程序运行时,此ImageCache处于活动状态,并使用getInstance(上下文上下文)调用。存储在其中的每个位图也会在某个时刻在ImageView上设置。

内存泄漏:当屏幕旋转时,仍在内存中的位图会回调到上一个图像视图。因此,之前的活动不会被破坏。但是,我并不想回收和销毁这个位图,因为它可能在应用程序的其他地方使用过。我认为我需要做的是删除从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。

0 个答案:

没有答案