首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FragmentStatePagerAdapter内存问题

FragmentStatePagerAdapter内存问题
EN

Stack Overflow用户
提问于 2015-09-04 16:04:19
回答 2查看 813关注 0票数 0

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

所以,这就是问题所在。我有一个大约50页的ViewPager。每个页面上都有一个带有单个ImageView图像(和一些其他元素)的片段。在浏览了大约20个独特的页面后,我通常会发现内存错误。所以,我的问题是:我应该如何配置FragmentStatePagerAdapter,使其在任何给定的时间只加载大约3页的内存?这是我的适配器的代码:

代码语言:javascript
复制
        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方法目前什么也不做。我是在从别人的问题上读到这件事后加上的。到目前为止,如果我的代码中有这两个方法,那么就没有什么不同了。

我读过其他类似于我的问题,但我最终决定问一个问题后,我自己试图解决问题,但没有好的结果。

我尝试在ImageView ()中将onDestroy设置为null,但什么也没有发生。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-04 17:05:53

BitmapFactory.decodeResource(getResources(), position)创建的BitmapFactory.decodeResource(getResources(), position)必须通过调用Bitmap.recycle()手动释放

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

票数 1
EN

Stack Overflow用户

发布于 2015-09-04 22:57:14

我已经开始使用位图作为ImageView的输入。下面的代码运行良好。

代码语言:javascript
复制
albumimg = BitmapFactory.decodeFile(mSong.getImg());
mImg.setImageBitmap(albumimg);
mImg.setVisibility(View.VISIBLE);

在onDestroy()和onDestroyView()中是这样的:

代码语言:javascript
复制
if(albumimg != null) {`albumimg.recycle(); }`

谢谢你的帮助。:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32402258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档