我在Activity中使用ViewPager对象。此viewpager用作显示多种类型片段的图库(TextFragment仅显示文本,ImageFragment,VideoFragment等)。
我正在使用FragmentStatePagerAdapter,它从我收集的内容(并由我自己看到)中释放了viewpager的先前元素,当您浏览它们时。
如果我只是通过画廊正常滑动它工作正常,看着LogCat显示正在分配和释放的内存(至少,对我来说似乎是合适的)。但是如果我在画廊中滑动得太快,似乎VM无法足够快地释放内存,最终我得到OutOfMemory异常。
有没有办法阻止这种情况?
这是我初始化活动的地方。
@Override
public void onCreate(Bundle savedInstanceState) {
mAdapter = new MyAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.pager);
mPager.setCurrentItem(currentItem);
mPager.setAdapter(mAdapter);
mPager.setOffscreenPageLimit(0);
CirclePageIndicator indicator = (CirclePageIndicator) findViewById(R.id.indicator);
mIndicator = indicator;
indicator.setViewPager(mPager);
}
这是我的适配器:
public class MyAdapter extends FragmentStatePagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return multimediaList.size();
}
@Override
public Fragment getItem(int position) {
Multimedia m = multimediaList.get(position);
if (m.getTipo() == MMType.Imagen) {
ImageFragment ifragment = new ImageFragment();
Bundle bundle = new Bundle();
bundle.putInt("id", m.getId());
ifragment.setArguments(bundle);
return ifragment;
}
else if (m.getTipo() == MMType.Video) {
VideoFragment ifragment = new VideoFragment();
Bundle bundle = new Bundle();
bundle.putInt("id", m.getId());
ifragment.setArguments(bundle);
return ifragment;
}
else if (m.getTipo() == MMType.LabeledImage) {
LabeledImageFragment ifragment = new LabeledImageFragment();
Bundle bundle = new Bundle();
bundle.putInt("id", m.getId());
ifragment.setArguments(bundle);
return ifragment;
}
else if (m.getTipo() == MMType.Texto) {
TextFragment ifragment = new TextFragment();
Bundle bundle = new Bundle();
bundle.putInt("id", m.getId());
ifragment.setArguments(bundle);
return ifragment;
}
return null;
}
}