2010-11-23 3 views
0

Je travaille sur une application simple qui dessine de petites bitmaps sur l'écran et qui a un peu de mal à effacer l'écran. Mes bitmaps sont stockés dans une ArrayList appelée _graphics, et j'ai besoin d'effacer l'écran, donc je vide mon ArrayList. Cela fonctionne très bien dans l'effacement de l'écran, mais après un certain temps ma force d'application se ferme.Erreur lors de la suppression des bitmaps [Android]

Si je dessine environ 50 bitmaps sur l'écran, il se fermera la première fois que je l'efface, mais si je dessine seulement 5, je peux obtenir environ 10 Clears avant qu'il ne se bloque. Je suppose que c'est quelque chose à voir avec le GC ne pas effacer les bitmaps correctement. Est-ce que quelqu'un a des idées sur le sujet?

+1

Vous devez envoyer la sortie logcat. – EboMike

+0

Voici: http: //pastebin.com/DVNTGhZj – PeterW

Répondre

1

En passant par le fichier Logcat, il semble que j'ai trouvé l'erreur (New Android Dev: p Je ne savais même pas qu'il existait). C'était dû à une exception ConcurrentModificationException. Tout semble fonctionner maintenant = D

1

OK - maintenant la trace de la pile est attachée: ConcurrentModificationException Vous modifiez ArrayList à partir de threads différents ou en itérant par-dessus. Soit vous devez synchroniser l'accès ou utiliser une autre collection comme ConcurrentHashSet.

Mais peut-être ce qui suit (ma réponse d'origine) sera intéressant aussi: p

Ressemble, que vous mise en cache des objets réels Bitmap avec l'ensemble des données de pixel -> Je suppose que, vous avez OutOfMemoryException

Le garbage collector est une opération asynchrone et si vous effacez votre tableau bitmap, les bitmaps ne sont pas déchargés de la mémoire instantanément. Si vous en insérez de nouveaux, cela peut arriver, les anciens sont toujours en mémoire et les nouveaux sont également chargés.

Solution: Ne mettez pas en cache les bitmaps de cette manière, c'est ce que vous faites.

Ils sont des choses différentes, vous pouvez essayer (dépend de scenrario béton yout):

1) Si elles sont stockées sur la carte SD ou autre chose, cache que le chemin vers les bitmaps dans votre collection et de les charger , si elles sont nécessaires pour le dessin. 2) Utiliser des objets Drawable au lieu de bitmaps - ils ont des méthodes et un algorithme intéressants pour un accès optimisé aux données bitmap.

3) Pour optimiser les performances, utilisez quelque chose comme SoftReference ou similaire - peut-être WeakRefernce. Les SoftReferences peuvent être déchargées par le GC à la demande (lorsque la mémoire est faible). Dans ce cas, vous devez vérifier si la référence douce est nulle ou existe toujours. par exemple:

ArrayList<SoftReference<Bitmap>> _graphics = new ArrayList<SoftReference<Bitmap>>(); 
... 

for (int i = 0; i < _graphics.size(); i++) 
{ 
    Bitmap b = _graphics.get(i).get(); 
    if (b == null) 
    { 
     b = loadFromSomewhere(i); 
     _graphics.add(new SoftReference<Bitmap>(b), i); 
    } 
    ... do something wwith your bitmap 
} 

Ce code snipet n'a pas été testé ou écrit avec un éditeur Java (s'il vous plaît excuser les erreurs de frappe ou de mauvaises signatures de méthode).

+0

2) Utilisez des objets Drawable au lieu de bitmaps - theys ont des méthodes intéressantes et un algorithme pour l'accès optimisé aux données bitmap. Pourriez-vous élaborer sur ce point? – 2cupsOfTech

Questions connexes