1

У меня есть утечка памяти (я думаю?), Где-то в моем приложении. И я действительно понятия не имею, где, я пытался следить за несколькими ссылками, объясняя разные способы закрытия ошибок OOM, но без везения.Проблемы с OutOfMemory в viewpager с изображениями

Дело в том, что у меня есть ViewPager с 209 страниц (данные загружены динамически, и тот же одиночный фрагмент используется для всех 209 страниц)

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

Я использую FragmentStatePagerAdapter.

Heres код, я действительно надеюсь, что вы, ребята, можете найти что-то, что я не могу. Кроме того, если вы найдете что-то, что должно быть другим, можно оптимизировать или что-нибудь еще, пожалуйста, расскажите. :

активность:

public class MovieInfo extends SherlockFragmentActivity{ 

    MyAdapter mAdapter; 
    ViewPager mPager; 
    static ArrayList<Movie> items; 

    public static class MyAdapter extends FragmentStatePagerAdapter { 


     public MyAdapter(FragmentManager fm) { 
      super(fm); 
     } 

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

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

     @Override 
     public Fragment getItem(int position) { 
      Fragment f = new MovieInfoFragment(); 
      Bundle args = new Bundle(); 
      args.putParcelable("item", items.get(position)); 
      f.setArguments(args); 
      return f; 
     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.movie_info_pager); 


     int mIndex = getIntent().getExtras().getInt("index", 0); 
     DataBaseHelper db = new DataBaseHelper(this); 
     items = (ArrayList<Movie>) db.getAllMovies(); 
     db.close(); 



     mAdapter = new MyAdapter(getSupportFragmentManager()); 

     mPager = (ViewPager)findViewById(R.id.pager); 
     mPager.setAdapter(mAdapter); 
     mPager.setCurrentItem(mIndex); 
    } 
} 

Фрагмент:

public class MovieInfoFragment extends SherlockFragment{ 


    private boolean clearArt = true; 
    private DisplayImageOptions options; 
    private Movie movie; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Bundle data = getArguments(); 
     movie = data.getParcelable("item"); 

     options = new DisplayImageOptions.Builder() 
     .cacheOnDisc() 
     .resetViewBeforeLoading() 
     .bitmapConfig(Bitmap.Config.RGB_565) 
     .imageScaleType(ImageScaleType.IN_SAMPLE_INT) 
     .build(); 

    } 



    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.movie_info, container, false); 

     if(movie != null){ 

      final ImageView clearArtID = (ImageView) view.findViewById(R.id.Movie_InfoClearArt); 
      final TextView title = (TextView) view.findViewById(R.id.Movie_InfoTitle); 
      final TextView genre = (TextView) view.findViewById(R.id.Movie_InfoGenre); 

      if(clearArt && movie.getClearArt() != null){ 
       clearArtID.setVisibility(ImageView.VISIBLE); 
       title.setVisibility(TextView.GONE); 
       genre.setVisibility(TextView.GONE); 
      }else{ 
       clearArtID.setVisibility(ImageView.GONE); 
       title.setVisibility(TextView.VISIBLE); 
       genre.setVisibility(TextView.VISIBLE); 
      } 

      ImageView fanart = (ImageView) view.findViewById(R.id.Movie_InfoFanart); 
      ImageLoader.getInstance().displayImage(movie.getFanart(), fanart, options); 
      final TextView lineone = (TextView) view.findViewById(R.id.Movie_InfoLineOneText); 
      final TextView linetwo = (TextView) view.findViewById(R.id.Movie_InfoLineTwoText); 
      final ImageView cover = (ImageView) view.findViewById(R.id.Movie_InfoCover); 
      final Movie mov = movie; 
      ImageLoader.getInstance().displayImage(movie.getThumb(), cover, options); 
      if(clearArt && movie.getClearArt() != null){ 
       ImageLoader.getInstance().displayImage(movie.getClearArt(), clearArtID, options, new ImageLoadingListener() { 
        @Override 
        public void onLoadingStarted(String imageUri, View view) { }  

        @Override 
        public void onLoadingFailed(String imageUri, View view, 
          FailReason failReason) { 
         clearArtID.setVisibility(ImageView.GONE); 
         title.setVisibility(TextView.VISIBLE); 
         genre.setVisibility(TextView.VISIBLE); 
         title.setText(mov.getTitle().toUpperCase(Locale.ENGLISH)); 
         genre.setText(mov.getGenreString()); 
         lineone.setText(String.valueOf(mov.getDirectorString())); 
         linetwo.setText("WRITER"); 
        } 

        @Override 
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { } 

        @Override 
        public void onLoadingCancelled(String imageUri, View view) { } 
       }); 
       lineone.setText(movie.getGenreString()); 
       linetwo.setText(movie.getDirectorString()); 
      }else{ 
       title.setText(movie.getTitle().toUpperCase(Locale.ENGLISH)); 
       genre.setText(movie.getGenreString()); 
       lineone.setText(String.valueOf(movie.getDirectorString())); 
       linetwo.setText("WRITER"); 
      } 
      TextView rating = (TextView) view.findViewById(R.id.Movie_InfoRating); 
      rating.setText(movie.getRating() + "/10"); 
      TextView runtime = (TextView) view.findViewById(R.id.Movie_InfoRuntime); 
      runtime.setText(movie.getPlaytime()/60 + " min"); 
      TextView year = (TextView) view.findViewById(R.id.Movie_InfoYear); 
      year.setText(String.valueOf(movie.getYear())); 

      HorizontalListView listview = (HorizontalListView) view.findViewById(R.id.Movie_InfoActorList); 
      listview.setAdapter(mAdapter); 

      TextView plot = (TextView) view.findViewById(R.id.Movie_InfoPlot); 
      plot.setText(movie.getPlot()); 

      if(movie.getCdart() != null){ 
       ImageView cdArt = (ImageView) view.findViewById(R.id.Movie_InfoCD); 
       ImageLoader.getInstance().displayImage(movie.getCdart(), cdArt, options); 
      } 
     } 
     return view; 
    } 
} 

EDIT:

Я знаю, что причина, мое приложение получает OutOfMemory ошибки в том, что она Безразлично» t выпускать растровые изображения в моем большом viewpager для сбора мусора, но как мне получить мое приложение для их выпуска? (читайте: сбор мусора), когда они в настоящее время не отображаются, один предыдущий или один следующий «слайд»?

Любая помощь оценена!

+0

Попробуйте найти утечки после этого [ссылка] (http://android-developers.blogspot.ru/2011/03/memory-analysis-for -android.html). (На api> = 3.0 ранние растровые изображения были сохранены в нативной куче) – esentsov

+0

Спасибо;) Я попробую следовать описанному в статье методу и вернуться с моими выводами. – smilykoch

ответ

0

Вы, вероятно, следует называть супер реализацию метода destroyItem

+0

Попытался добавить его в конец моего destroyItem, к сожалению это ничего не изменило: / – smilykoch

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