0

Я делаю приложение с классом ViewPager и адаптером FragmentStatePagerAdapter. Я читал, что разница между указанным адаптером и FragmentPagerAdapter заключается в том, что в дальнейшем все страницы хранятся сразу, а FragmentStatePagerAdapter имеет только 3 загруженных в памяти в любой момент времени.Ошибка памяти FragmentStatePagerAdapter

Итак, вот в чем проблема. У меня есть ViewPager с примерно 50 страницами. На каждой странице есть фрагмент с одним изображением 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 в настоящее время ничего не делают. Я добавил их после прочтения об этом по чужому вопросу. На данный момент нет разницы, если у меня есть эти два метода в моем коде или нет.

Я читал другие вопросы, похожие на мои, но я, наконец, решил задать вопрос после попытки самостоятельно решить проблему без каких-либо хороших результатов.

Я попытался установить ImageView в null в onDestroy(), но ничего не произошло.

ответ

0

Я начал использовать растровые изображения в качестве входных данных для ImageView. Код ниже работает нормально.

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

И это в OnDestroy() и onDestroyView():

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

Спасибо за помощь. :)

 Смежные вопросы

  • Нет связанных вопросов^_^