GridView et Out of memory
Bonjour,
Depuis que j'essaye mon application sur android 2.3.3, elle ne fonctionne plus.
Mon activity possède 2 GridView avec quelques icônes. Et des que je passe d'un "contentview" à un autre 1 fois de trop, j'ai un message d'erreur qui m'a l'air de poser des problèmes à beaucoup de gens au vu de mes recherches :
Code:
1 2 3 4 5 6 7 8 9 10
| 06-14 01:12:44.414: ERROR/AndroidRuntime(7432): FATAL EXCEPTION: main
06-14 01:12:44.414: ERROR/AndroidRuntime(7432): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
06-14 01:12:44.414: ERROR/AndroidRuntime(7432): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
06-14 01:12:44.414: ERROR/AndroidRuntime(7432): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:460)
06-14 01:12:44.414: ERROR/AndroidRuntime(7432): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
06-14 01:12:44.414: ERROR/AndroidRuntime(7432): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
06-14 01:12:44.414: ERROR/AndroidRuntime(7432): at android.content.res.Resources.loadDrawable(Resources.java:1782)
06-14 01:12:44.414: ERROR/AndroidRuntime(7432): at android.content.res.Resources.getDrawable(Resources.java:588)
06-14 01:12:44.414: ERROR/AndroidRuntime(7432): at android.widget.ImageView.resolveUri(ImageView.java:501)
06-14 01:12:44.414: ERROR/AndroidRuntime(7432): at android.widget.ImageView.setImageResource(ImageView.java:280) |
Donc d'après ma recherche, j'utilise trop de mémoire (O_o), je veux bien, mais j'ai juste un Xml qui défini le GridView et ci-dessous le code de mon adapter :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| public class MenuGridViewAdapter extends BaseAdapter
{
private ArrayList<Integer> idIconList;
private Context context;
private int screenWidth;
public MenuGridViewAdapter(Context c, ArrayList<Integer> list)
{
context = c;
idIconList = list;
Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
screenWidth = display.getWidth();
}
public int getCount()
{
return idIconList.size();
}
public Object getItem(int item)
{
return item;
}
public long getItemId(int arg0)
{
return 0;
}
public View getView(int position, View convertView, ViewGroup parent)
{
ImageView imageView;
// Calcul de la dimension maximum des marges
int margin = (int) (screenWidth * 3 / 100);
// Calcul de la dimension maximum des icônes
int size = (int)((screenWidth - 4 * margin) / 3);
if (convertView == null)
{
imageView = new ImageView(context);
imageView.setPadding(margin, margin, margin, margin);
imageView.setScaleType(ImageView.ScaleType.FIT_START);
imageView.setLayoutParams(new GridView.LayoutParams(size, size));
imageView.setImageResource(idIconList.get(position));
}
else
imageView = (ImageView) convertView;
return imageView;
}
} |
J'avais pour idée de désallouer par un recycle tous les éléments (imageview) du GridView mais je ne vois pas très bien comment faire ?
Et puis ça me parait étrange que cela ne soit pas fait automatiquement par le système non ?
Merci d'avance.