0

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

    }
4

0 回答 0