2010-06-03 7 views
2

J'utilise GridView pour afficher les vignettes de MediaStore. Si je lance et ferme mon application 2-3 fois il se bloque avec erreur de mémoire. System.gc() est appelé onCréer l'activité principale. Si appel de commentaire setImageURI puis pas d'erreurs. Peut-être que j'ai besoin d'effacer explicitement la mémoire en quelque sorte? S'il vous plaît, aidez.GridView erreur de mémoire insuffisante

public View getView(int position, View convertView, ViewGroup parent){ 
      ImageView i; 
      if (convertView == null) { 
        i = new ImageView(activity.getApplicationContext()); 
        i.setLayoutParams(new GridView.LayoutParams(92, 92)); 
        i.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      } else { 
        i = (ImageView) convertView; 
      } 
      Uri imageUri = thumbUri(position); 
      i.setImageURI(imageUri); // <--- no error if this string is commented 
      return i; 
    } 

Répondre

4

Je l'ai. Ma solution basée sur Francesco répond, mais onPause au lieu de onDestroy.

@Override 
protected void onPause() { 
    GridView gridView = (GridView) findViewById(R.id.public_photos); 
    int count = gridView.getCount(); 
    for (int i = 0; i < count; i++) { 
     ImageView v = (ImageView) gridView.getChildAt(i); 
     if (v != null) { 
      if (v.getDrawable() != null) v.getDrawable().setCallback(null); 
     } 
    } 
    super.onPause(); 
} 
3

Il semble que vous fuyez la mémoire ailleurs. Essayez de supprimer tous les callbacks de votre ImageView avec quelque chose comme ceci:

@Override 
protected void onDestroy(){ 
    super.onDestroy(); 

    int count = gridView.getCount(); 
    for (int i = 0; i < count; i++){ 

     final ImageView v = (ImageView) gridView.getChildAt(i); 
     v.getDrawable().setCallback(null); 
    } 



} 
+0

pas de chance. Comment déboguer des ressources inédites? – Improver

+0

Vous pouvez utiliser Allocation Tracker. Switch Exclipse dans le DDMS prospective et vous pouvez trouver le contrôle de suivi d'allocation là –

Questions connexes