У меня есть утечка памяти (я думаю?), Где-то в моем приложении. И я действительно понятия не имею, где, я пытался следить за несколькими ссылками, объясняя разные способы закрытия ошибок 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 для сбора мусора, но как мне получить мое приложение для их выпуска? (читайте: сбор мусора), когда они в настоящее время не отображаются, один предыдущий или один следующий «слайд»?
Любая помощь оценена!
Попробуйте найти утечки после этого [ссылка] (http://android-developers.blogspot.ru/2011/03/memory-analysis-for -android.html). (На api> = 3.0 ранние растровые изображения были сохранены в нативной куче) – esentsov
Спасибо;) Я попробую следовать описанному в статье методу и вернуться с моими выводами. – smilykoch