Android OutOfMemoryError:?
Je suis sporadiquement obtenir un OutOfMemoryError: (Heap Size=49187KB, Allocated=41957KB)
dans une de mes applications. Que puis-je faire pour diagnostiquer ce?
01-09 10:32:02.079: E/dalvikvm(8077): Out of memory: Heap Size=49187KB, Allocated=41957KB, Limit=49152KB
01-09 10:32:02.079: E/dalvikvm(8077): Extra info: Footprint=48611KB, Allowed Footprint=49187KB, Trimmed=7852KB
01-09 10:32:02.079: D/skia(8077): --- decoder->decode returned false
01-09 10:32:02.079: D/AndroidRuntime(8077): Shutting down VM
01-09 10:32:02.079: W/dalvikvm(8077): threadid=1: thread exiting with uncaught exception (group=0x40a97228)
01-09 10:32:02.079: E/AndroidRuntime(8077): FATAL EXCEPTION: main
01-09 10:32:02.079: E/AndroidRuntime(8077): java.lang.OutOfMemoryError: (Heap Size=49187KB, Allocated=41957KB)
01-09 10:32:02.079: E/AndroidRuntime(8077): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
01-09 10:32:02.079: E/AndroidRuntime(8077): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:486)
01-09 10:32:02.079: E/AndroidRuntime(8077): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
01-09 10:32:02.079: E/AndroidRuntime(8077): at android.content.res.Resources.loadDrawable(Resources.java:2044)
01-09 10:32:02.079: E/AndroidRuntime(8077): at android.content.res.Resources.getDrawable(Resources.java:675)
01-09 10:32:02.079: E/AndroidRuntime(8077): at android.view.View.setBackgroundResource(View.java:11776)
01-09 10:32:02.079: E/AndroidRuntime(8077): at com.blsk.bigtoss.ImageLoader.DisplayImage(ImageLoader.java:81)
01-09 10:32:02.079: E/AndroidRuntime(8077): at com.blsk.bigtoss.MatchActivity$MatchAsyncTask.onPostExecute(MatchActivity.java:1768)
01-09 10:32:02.079: E/AndroidRuntime(8077): at android.os.AsyncTask.finish(AsyncTask.java:602)
01-09 10:32:02.079: E/AndroidRuntime(8077): at android.os.AsyncTask.access$600(AsyncTask.java:156)
01-09 10:32:02.079: E/AndroidRuntime(8077): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
01-09 10:32:02.079: E/AndroidRuntime(8077): at android.os.Handler.dispatchMessage(Handler.java:99)
01-09 10:32:02.079: E/AndroidRuntime(8077): at android.os.Looper.loop(Looper.java:156)
01-09 10:32:02.079: E/AndroidRuntime(8077): at android.app.ActivityThread.main(ActivityThread.java:4987)
01-09 10:32:02.079: E/AndroidRuntime(8077): at java.lang.reflect.Method.invokeNative(Native Method)
01-09 10:32:02.079: E/AndroidRuntime(8077): at java.lang.reflect.Method.invoke(Method.java:511)
01-09 10:32:02.079: E/AndroidRuntime(8077): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-09 10:32:02.079: E/AndroidRuntime(8077): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-09 10:32:02.079: E/AndroidRuntime(8077): at dalvik.system.NativeStart.main(Native Method)
01-09 10:32:02.099: E/EmbeddedLogger(1612): App crashed! Process: com.blsk.bigtoss
01-09 10:32:02.099: E/EmbeddedLogger(1612): App crashed! Package: com.blsk.bigtoss v6 (1.2)
01-09 10:32:02.129: E/EmbeddedLogger(1612): Application Label: Cricket
C'est la ligne où ça se passe:
LinearLayout resultMatchHeaderContainer = new LinearLayout(activity);
if (!resultImagePath.equals("")) {
imageLoader.DisplayImage(resultImagePath,resultMatchHeaderContainer, -1,modifiedHeight, R.drawable.matches_placeholder_result2x);
} else {
try {
resultMatchHeaderContainer.setBackgroundResource(R.drawable.matches_placeholder_result2x);
} catch (OutOfMemoryError e) {
e.printStackTrace();
}
}
- Vous essayez de charger une image bitmap dans une ImageView. Clairement le bitmap vous êtes parfois le chargement est trop grand pour tenir dans la mémoire. Vous avez besoin pour réduire l'échelle de l'image comme vous le lire. Regardez inSampleSize
- avez-vous résolu votre problème ou pas?
- non pas encore trying...@dipali
- quoi?n'avez-vous pas résolu votre prblm?
- cette erreur se produit uniquement du temps n'est pas toutes les fois @dipali
- merci de redimensionner ur de la base d'image sur votre appareil.je vais mettre le code...ici..s'il vous plaît vérifier
Vous devez vous connecter pour publier un commentaire.
peut-être que cela vous aide ?
ajouter manifeste
android > v3
Solutions courantes:
1. Fixer votre contextes:
Essayez d'utiliser le approprié au contexte: Par exemple, depuis un Toast peut être vu dans de nombreuses activités, au lieu de seulement un, utilisez
getApplicationContext()
pour des toasts, et étant donné que les services peuvent continuer à fonctionner même si une activité est terminée démarrer un service avec:Intent myService = new Intent(getApplicationContext(), MyService.class)
Utiliser ce tableau comme un guide rapide pour quel contexte est approprié:
Original l'article sur le contexte ici.
2. Vérifiez que vous êtes réellement la finition de vos services.
Par exemple, j'ai un intentService qui utilisent le service de localisation de google api. Et j'ai oublié d'appeler
googleApiClient.disconnect();
:3. Vérifiez l'image et les images bitmap d'utilisation:
Si vous êtes en utilisant la place du bibliothèque Picasso j'ai trouvé que j'ai une fuite de mémoire en n'utilisant pas la
.fit()
, que considérablement réduit mon empreinte mémoire à partir de 50 mo en moyenne à moins de 19 MO:4. Si vous utilisez des récepteurs de radiodiffusion annuler l'enregistrement.
5. Si vous utilisez
java.util.Observer
(modèle Observateur):Assurez-vous d'utiliser
deleteObserver(observer);
Vous pouvez effectuer les opérations suivantes pour éviter cela.
Chargement Bitmap dans Imageview toujours été une cause de problème de mémoire, il est très commun de sorte que nous avons à gérer imageview et les bitmaps très soigneusement. Ce que vous pouvez faire est Alors que la fixation de l'image d'arrière-plan à votre imageview de la première à obtenir le drawable et le recycler de sorte qu'il est supprimé de la mémoire et de définir ensuite la nouvelle image bitmap. Cela aidera à éviter toute question OOM. Plus loin. Vous pouvez utiliser BitmapFactoryOptions pour réduire la taille de votre image. comme:
Avant le chargement des images dans la mémoire de compresser vos images à l'aide de
Si vous êtes geting votre image bitmap à partir d'une ressource, auquel cas l'image bitmap dimension dépendra de l'écran du téléphone de la densité
Cela peut se produire pour plusieurs raisons, vous pourriez être en gardant des références à d'autres parties de votre code trop long. Vous pouvez être chargé pour les grandes images bitmap qui, ensemble, avec maintenant sur de nombreuses références vous donne OOM, etc.
Habituellement, quand un OOM se produit un hprof (instantané du Tas) est créé à la racine de la carte sd (ou de stockage interne si sdcard n'existe pas), qui peut être lu par des outils tels que Eclipse MAT (inclus dans le android outils si vous utilisez Eclipse). D'abord on pourrait avoir besoin de convertir les hprof avec
hprof-conv
outil. Voici un tutoriel sur la façon d'utiliser Eclipse MAT: Enquêter sur Votre Utilisation de la RAM. La fuite des suspects rapport est une bonne première lecture lors de la hprof est chargé dans Eclipse MATAprès profilage vous vous avez pu lire sur la façon de charger les images de manière efficace à partir de Affichage Des Images De Manière Efficace
Il y a également plusieurs applications de chargement de l'image des bibliothèques comme image universelle de chargeur et picasso disponibles, faire ce que vous avez besoin avec facilité.
hprof
pour voir si vous êtes en attente pour de trop nombreuses références d'une certaine sorte, si ce n'est pas le cas, vous pouvez envisager d'utiliser une partie de l'image des bibliothèques qui sont la mise en cache des images et de les adapter à des besoins en vue de tailles besoins avec facilité.Bitmap final sourire = BitmapFactory.decodeResource(getResources(), R. drawable.emo_im_happy);
Appel
String pathname=BitMapToString(smile);
et ensuite appeler
...
s'il vous plaît mettez toutes les fonctions dans votre activité et appeler seulement
setImageNew()
et de passer des paramètres dans imageview ,sdcardpathname et de l'activitéJ'espère qu'il ne va pas planter après l'application de ce code.
parce que je surviennent même problème que vous..
Cela peut se produire si la ressource d'image ne sont pas éliminés correctement. Il est préférable de lire les dimensions pour voir si elle correspond à la mémoire.
http://developer.android.com/training/displaying-bitmaps/load-bitmap.html