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!
Je ne vois que deux options:
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.
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" />
Quelques astuces pour gérer une telle erreur/exception pour les applications Android:
Activités et application ont des méthodes comme:
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.
Gestion de la mise en cache en mémoire et de la mise en cache du disque:
Utilisation de WeakReference, référence souple de la création d’instances Java, en particulier pour les fichiers.
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.
Gérer l'exception OutOfMemory
Suivre les meilleures pratiques pour le codage
Minimiser la pile d’activités, par ex. nombre d'activités dans la pile (ne pas tout tenir sur le contexte/activité)
Minimiser l'utilisation de la statique, beaucoup plus de singletons.
S'occuper des fondamentaux de la mémoire de base du système d'exploitation
Involk GC.Collect () manuellement parfois lorsque vous êtes sûr que la mise en cache en mémoire n'est plus nécessaire.