FragmentStatePagerAdapter内存问题

时间:2015-09-04 16:04:19

标签: android memory android-viewpager fragmentpageradapter fragmentstatepageradapter

我正在使用ViewPager类和FragmentStatePagerAdapter适配器创建应用程序。我已经读过,提到的适配器和FragmentPagerAdapter之间的区别在于后者同时将所有页面存储在内存中,而FragmentStatePagerAdapter在任何给定时间内只有3个内存加载。

所以,这是问题所在。我有一个大约50页的ViewPager。每个页面上都有一个片段,其中包含一个ImageView图像(以及一些其他元素)。滚动浏览大约20个唯一页面后,我通常会遇到内存不足错误。所以,我的问题是:我应该如何配置FragmentStatePagerAdapter在任何给定时间只在内存中加载大约3个页面?这是我的适配器的代码:

        mViewPager.setAdapter(new FragmentStatePagerAdapter(fm) {

        @Override
        public Fragment getItem(int position) {
            Song song = mSongs.get(position);
            return PlayFragment.newInstance(position);
        }

        @Override
        public int getCount() {
            return mSongs.size();
        }

        @Override
        public void destroyItem(View collection, int position, Object o) {
            View view = (View)o;
            ((ViewPager) collection).removeView(view);
            view = null;
        }

        @Override
        public Object instantiateItem(View context, int position) {
            ImageView imageView = new ImageView(getApplicationContext());
            imageView.findViewById(R.id.albumimage);
            imageView.setImageBitmap(BitmapFactory.decodeResource(getResources(), position));

            ((ViewPager) context).addView(imageView);

            return imageView;
        }

        });

destroyItem和instantiateItem方法目前什么都不做。我从其他人的问题中读到这些内容后,我已经添加了它们。如果我的代码中有这两种方法,那么现在没有区别。

我已经阅读了与我类似的其他问题,但我最终决定在尝试自己解决问题后提出一个问题而没有取得好成绩。

我尝试在onDestroy()中将ImageView设置为null,但没有任何反应。

2 个答案:

答案 0 :(得分:1)

Bitmap创建的

BitmapFactory.decodeResource(getResources(), position)必须通过致电Bitmap.recycle()

手动发布

https://developer.android.com/training/displaying-bitmaps/manage-memory.html

答案 1 :(得分:0)

我已经开始使用位图作为ImageView的输入。下面的代码工作正常。

albumimg = BitmapFactory.decodeFile(mSong.getImg());
mImg.setImageBitmap(albumimg);
mImg.setVisibility(View.VISIBLE);

这在onDestroy()和onDestroyView()中:

if(albumimg != null) {`albumimg.recycle(); }`

感谢您的帮助。 :)