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(); }` 

感謝您的幫助。 :)