我正在尝试创建一些相册应用程序。但是在创建新的 Fragment 时,旧的 Fragment 会留下来,并且它包含的 Bitmaps 会迅速填满我的内存,从而导致内存不足错误。
这是我正在尝试做的事情:
假设我有 3 个类别。婚纱照、暑假等。单击每个类别后,我想在其旁边的片段中显示照片。
对于主视图,我使用 MasterDetailFlow 模板中的 FragmentActivity(当您在 Eclipse 中创建新的 Android 项目时)。所以基本上它有一个带有 listView 的片段(这里是我的类别)和 framelayout 来放置我的另一个片段。
因为我想为图片创建 ViewPager,所以我创建了 Fragment
android.support.v4.view.ViewPager
在框架布局内(在 Activity onItemSelected :) 中:
fragment = new PagerFragment();
fragment.setArguments(arguments);
getSupportFragmentManager().beginTransaction()
.replace(R.id.item_detail_container, fragment).commit();
这个片段基本上只是用来设置:
onCreateView ....
rootView = inflater.inflate(R.layout.pager, container, false);
myFragmentStatePagerAdapter = new MyFragmentStatePagerAdapter(
getActivity().getSupportFragmentManager(), pictures);
mViewPager = (ViewPager) rootView.findViewById(R.id.pager);
mViewPager.setAdapter(myFragmentStatePagerAdapter);
return rootView;
另一方面,适配器在 getItem 方法中创建新的 PictureFragment。
PictureFragment 使用 BitmapFactory 和 LruCache 来获取图片。我将 WeakReference 存储到 PictureFragment 和 onDestroyView() 中的位图我调用:
if (bitmapReference !=null){
bitmapReference.get().recycle();
bitmapReference = null;
}
现在来解决问题。在一个 PagerFragment 中看起来一切正常。图片片段被创建和销毁。记忆似乎得到了控制。但是当我单击其他列表元素上的活动时,问题就开始了。我可以在日志中看到正在为 pager View 创建两个新片段,我可以看到在 PagerFragment 上调用了 onDestroyView() 方法,但在 PictureFragment 上没有调用方法,我认为这会导致位图未被回收。因此内存不足错误。那么我做错了什么?如何去除里面的PicturesFragment和位图?
感谢帮助
W