0

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

所以,这是问题所在。我有一个约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,但没有发生任何事情。

回答

0

我一直在使用位图作为ImageView的输入开始手动释放。下面的代码工作正常。

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

而这的onDestroy()和onDestroyView():

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

感谢您的帮助。 :)