Ich arbeite an einer Gamebook-Anwendung, die 12 Ansichten in einem ViewPager zeigt. Dies ist meine Gewohnheit PagerAdapter:Android setBackgroundResource Ursache nicht genügend Speicher excepiton
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();
}
}
Bei einigen Geräten es nicht genügend Arbeitsspeicher exceptionr zufällig verursachen, wenn diese Codezeile
genannt wirdrelLayImageView.setBackgroundResource(mImages[position]);
Aber in allen Geräten ich so etwas wie dies in der zu sehen logcat wenn ich umblättern:
12-31 00:25:31.655: I/dalvikvm-heap(9767): Grow heap (frag case) to 50.875MB for 10384016-byte allocation
die App auch in einigen Geräten für das gleiche Problem stürzen ab, wenn in einer anderen Aktivität I unterschiedliche Hintergrund Ressource festgelegt zum Hauptlayout basierend auf Benutzeraktion. Hier ist der Code:
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]);
}
});
Es läuft excepiton wieder, wenn ich rufe setBackgroundResource() auf mainLayout.
Ich hoffe, Sie können mir helfen, dies zu lösen, danke im Voraus!
Klingt, als würden Sie einige _huge_ Hintergründe laden und das Gerät hat nicht genug Speicher für sie ... –
Ja, aber manchmal passiert auf Geräten mit viel Speicher, und passiert nicht in Geräten mit weniger Speicher .. Ich Lade Bilder, die nicht wirklich groß sind (von 50 bis 200 kb). – TheModularMind
Sie klingen _huge_ nicht. Sie könnten versuchen, die Bitmaps selbst zu recyceln, bevor Sie die Hintergrundressource ändern. Holen Sie sich den alten Hintergrund aus und nach dem Ändern sehen Sie, ob es ein 'BitmapDrawable' ist, wenn es dann' recycle() 'auf seiner' Bitmap' genannt wird. –