Sto lavorando a un'applicazione gamebook che mostra 12 visualizzazioni in un ViewPager. Questo è il mio PagerAdapter personalizzato:Android setBackgroundResource causa memoria insufficiente
private class ImagePagerAdapter extends PagerAdapter {
private int[] mImages = new int[] { R.drawable.copertinai,
R.drawable.blui, R.drawable.azzurroi, R.drawable.rossoi,
R.drawable.gialloi, R.drawable.verdei, R.drawable.rosai,
R.drawable.grigioi, R.drawable.neroi, R.drawable.arancionei,
R.drawable.marronei, R.drawable.violai, R.drawable.ulm };
@Override
public int getCount() {
return mImages.length;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == ((RelativeLayout) object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Context context = MainActivity.this;
RelativeLayout relLayImageView = new RelativeLayout(context);
relLayImageView.setBackgroundResource(mImages[position]);
((ViewPager) container).addView(relLayImageView, new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
return relLayImageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager) container).removeView((RelativeLayout) object);
object=null;
System.gc();
}
}
In alcuni dispositivi che causano un fuori exceptionr memoria in modo casuale quando questa riga di codice si chiama
relLayImageView.setBackgroundResource(mImages[position]);
Ma in tutti i dispositivi che vedo qualcosa di simile nel logcat pagine quando accendo:
12-31 00:25:31.655: I/dalvikvm-heap(9767): Grow heap (frag case) to 50.875MB for 10384016-byte allocation
l'applicazione si blocca anche in alcuni dispositivi per lo stesso problema quando in un'altra attività ho impostato diversa risorsa di sfondo al layout principale basato sull'azione dell'utente. Ecco il codice:
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
colorButtons.get(indiceColoreAttuale).setBackgroundResource(
unSelectedColorsRes[indiceColoreAttuale]);
switch (index) {
case 0:
mainLayout.setBackgroundResource(R.drawable.blus);
break;
case 1:
mainLayout
.setBackgroundResource(R.drawable.azzurros);
break;
case 2:
mainLayout
.setBackgroundResource(R.drawable.rossos);
break;
case 3:
mainLayout
.setBackgroundResource(R.drawable.giallos);
break;
case 4:
mainLayout
.setBackgroundResource(R.drawable.verdes);
break;
case 5:
mainLayout
.setBackgroundResource(R.drawable.rosas);
break;
case 6:
mainLayout
.setBackgroundResource(R.drawable.grigios);
break;
case 7:
mainLayout
.setBackgroundResource(R.drawable.neros);
break;
case 8:
mainLayout
.setBackgroundResource(R.drawable.arancios);
break;
case 9:
mainLayout
.setBackgroundResource(R.drawable.marrones);
break;
case 10:
mainLayout
.setBackgroundResource(R.drawable.violas);
break;
}
mainLayout.startAnimation(animationShowTextColor);
mainLayout.setGravity(Gravity.CENTER_HORIZONTAL);
indiceColoreAttuale = index;
colorButtons.get(index).setBackgroundResource(
selectedColorsRes[index]);
}
});
Corre excepiton di nuovo quando chiamo setBackgroundResource() su mainLayout.
Spero che tu possa aiutarmi a risolvere questo, grazie in anticipo!
Sembra che tu stia caricando alcuni sfondi _huge_ e che il dispositivo non abbia memoria sufficiente per loro ... –
Sì, ma a volte accade su dispositivi con molta memoria, e non succede in dispositivi con meno memoria .. I caricare immagini che non sono molto grandi (da 50 a 200 kb). – TheModularMind
Non suonano _huge_. Potresti provare a "riciclare" le bitmap prima di cambiare la risorsa di sfondo. Prendi il vecchio sfondo disegnabile e dopo averlo modificato vedi se è un 'BitmapDrawable', se è quindi chiama' recycle() 'sul suo' Bitmap'. –