我在 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;
}
}