web-dev-qa-db-fra.com

Comment résoudre les problèmes Java.lang.OutOfMemoryError sous Android

Bien que j'ai une image de très petite taille dans un dossier pouvant être dessiné, je reçois cette erreur des utilisateurs. Et je n'utilise aucune fonction bitmap dans le code. Au moins intentionnellement :)

Java.lang.OutOfMemoryError
    at Android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
    at Android.graphics.BitmapFactory.decodeStream(BitmapFactory.Java:683)
    at Android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.Java:513)
    at Android.graphics.drawable.Drawable.createFromResourceStream(Drawable.Java:889)
    at Android.content.res.Resources.loadDrawable(Resources.Java:3436)
    at Android.content.res.Resources.getDrawable(Resources.Java:1909)
    at Android.view.View.setBackgroundResource(View.Java:16251)
    at com.autkusoytas.bilbakalim.SoruEkrani.cevapSecimi(SoruEkrani.Java:666)
    at com.autkusoytas.bilbakalim.SoruEkrani$9$1.run(SoruEkrani.Java:862)
    at Android.os.Handler.handleCallback(Handler.Java:733)
    at Android.os.Handler.dispatchMessage(Handler.Java:95)
    at Android.os.Looper.loop(Looper.Java:146)
    at Android.app.ActivityThread.main(ActivityThread.Java:5602)
    at Java.lang.reflect.Method.invokeNative(Native Method)
    at Java.lang.reflect.Method.invoke(Method.Java:515)
    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1283)
    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1099)
    at dalvik.system.NativeStart.main(Native Method)

Selon cette pile, je reçois cette erreur sur cette ligne ('tv' est un textView):

tv.setBackgroundResource(R.drawable.yanlis);

Quel est le problème? Si vous avez besoin d’autres informations sur le code, je peux les ajouter ..___ Merci!

59
Utku Soytaş

Je ne vois que deux options:

  1. Vous avez des fuites de mémoire dans votre application.
  2. Les périphériques ne disposent pas de suffisamment de mémoire lors de l'exécution de votre application.
3
Cativail

Vous devez implémenter un gestionnaire de cache LRU lorsqu’il s’agit de bitmap

http://developer.Android.com/reference/Android/util/LruCache.htmlhttp://developer.Android.com/training/displaying-bitmaps/cache-bitmap.htmlQuand devrais-je recycler un bitmap en utilisant LRUCache?

OR

Utilisez une bibliothèque de niveau telle que Universal Image Loader: 

https://github.com/nostra13/Android-Universal-Image-Loader

MODIFIER : 

Maintenant, lorsque je traite des images et la plupart du temps avec des images bitmap, j’utilise Glide, qui vous permet de configurer un module Glide et un LRUCache.

https://github.com/bumptech/glide

3
An-droid

Si vous obtenez cette erreur Java.lang.OutOfMemoryError c'est le problème le plus fréquent qui se produit dans Android. Cette erreur est générée par la machine virtuelle Java (JVM) lorsqu'un objet ne peut pas être attribué en raison d'un manque d'espace mémoire.

Essayez ce Android:hardwareAccelerated="false" , Android:largeHeap="true"dans votre fichier manifest.xml sous application comme ceci:

<application
  Android:name=".MyApplication"
  Android:allowBackup="true"
  Android:icon="@mipmap/ic_launcher"
  Android:label="@string/app_name"
  Android:theme="@style/AppTheme"
  Android:hardwareAccelerated="false"
  Android:largeHeap="true" />
1
Gaurav Lambole

Quelques astuces pour gérer une telle erreur/exception pour les applications Android:

  1. Activités et application ont des méthodes comme:

    • onLowMemory
    • onTrimMemory Traitez ces méthodes pour surveiller l'utilisation de la mémoire.
  2. La balise dans Manifest peut avoir l'attribut 'largepoil' défini sur VRAI, ce qui demande plus de tas pour le sandbox de l'application.

  3. Gestion de la mise en cache en mémoire et de la mise en cache du disque:

    • Les images et autres données auraient pu être mises en cache en mémoire lors de l'exécution de l'application (localement dans activités/fragment et globalement); doit être géré ou supprimé.
  4. Utilisation de WeakReference, référence souple de la création d’instances Java, en particulier pour les fichiers.

  5. Si vous avez autant d’images, utilisez la structure de bibliothèque/données appropriée qui peut gérer la mémoire, utilisez l’échantillonnage des images chargées, gérez la mise en cache sur le disque.

  6. Gérer l'exception OutOfMemory

  7. Suivre les meilleures pratiques pour le codage 

    • Fuite de mémoire (ne pas tout tenir avec une forte référence)
  8. Minimiser la pile d’activités, par ex. nombre d'activités dans la pile (ne pas tout tenir sur le contexte/activité)

    • Le contexte a du sens, ces données/instances non requises hors de la portée (activité et fragments) les conservent dans un contexte approprié au lieu d'une base de référence globale.
  9. Minimiser l'utilisation de la statique, beaucoup plus de singletons.

  10. S'occuper des fondamentaux de la mémoire de base du système d'exploitation

    • Problèmes de fragmentation de la mémoire
  11. Involk GC.Collect () manuellement parfois lorsque vous êtes sûr que la mise en cache en mémoire n'est plus nécessaire.

0
Sandipkumar Savani