Bibliothèque Picasso – Mémoire insuffisante

J'utilise la dernière version 2.4.0 de la bibliothèque Picasso dans mon application pour télécharger et mettre en cache les images. Il y a environ 25-30 images de taille 300KB-400KB chacune. Je pense que ce n'est pas quelque chose de grand ou lourd.

Même si l'application fonctionne bien, je ne supporte pas les allocations de mémoire dans mon logcat. Quelqu'un peut-il expliquer pourquoi cela se passe-t-il?

  • Utiliser RecyclerVoir à l'intérieur de ScrollView avec hauteur de l'élément Recycler flexible
  • ADB Driver et Windows 8.1
  • Impossible d'installer la version de débogage et de sortie sur le même périphérique
  • Installation automatique d'Android
  • Spécification de la RAM Android Market dans le Manifeste
  • Comment dessiner du texte dans le marquage par défaut de google map v2
  • Code pour charger des images dans l'adaptateur GridView:

    Picasso.with(mContext).load(getUrl()).placeholder(R.drawable.placeholder) .into(viewholder.image); 

    Voici ma sortie Logcat:

     I/dalvikvm-heap(11142): Grow heap (frag case) to 53.860MB for 2720016-byte allocation I/dalvikvm-heap(11142): Forcing collection of SoftReferences for 3265936-byte allocation E/dalvikvm-heap(11142): Out of memory on a 3265936-byte allocation. I/dalvikvm(11142): "Picasso-/images/posters/34.71.jpg" prio=5 tid=18 RUNNABLE I/dalvikvm(11142): | group="main" sCount=0 dsCount=0 obj=0x4283f248 self=0x60a47830 I/dalvikvm(11142): | sysTid=11196 nice=10 sched=0/0 cgrp=apps/bg_non_interactive I/dalvikvm(11142): | state=R schedstat=( 2070202497 1858185620 3947 ) utm=172 stm=35 core=3 I/dalvikvm(11142): at android.graphics.Bitmap.nativeCreate(Native Method) I/dalvikvm(11142): at android.graphics.Bitmap.createBitmap(Bitmap.java:726) I/dalvikvm(11142): at android.graphics.Bitmap.createBitmap(Bitmap.java:703) I/dalvikvm(11142): at android.graphics.Bitmap.createBitmap(Bitmap.java:636) I/dalvikvm(11142): at com.squareup.picasso.BitmapHunter.transformResult(BitmapHunter.I/dalvikvm(11142): at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:168) I/dalvikvm(11142): at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:111) I/dalvikvm(11142): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:390I/dalvikvm(11142): at java.util.concurrent.FutureTask.run(FutureTask.java:234) I/dalvikvm(11142): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.I/dalvikvm(11142): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.I/dalvikvm(11142): at java.lang.Thread.run(Thread.java:841) I/dalvikvm(11142): at com.squareup.picasso.Utils$PicassoThread.run(Utils.java:408) I/dalvikvm-heap(11142): Forcing collection of SoftReferences for 3265936-byte allocation E/dalvikvm-heap(11142): Out of memory on a 3265936-byte allocation. I/dalvikvm(11142): "Picasso-/images/posters/34.71.jpg" prio=5 tid=17 RUNNABLE I/dalvikvm(11142): | group="main" sCount=0 dsCount=0 obj=0x42841b88 self=0x5ec91f90 I/dalvikvm(11142): | sysTid=11183 nice=10 sched=0/0 cgrp=apps/bg_non_interactive I/dalvikvm(11142): | state=R schedstat=( 2050467088 1713164574 3713 ) utm=172 stm=32 core=3 I/dalvikvm(11142): at android.graphics.Bitmap.nativeCreate(Native Method) I/dalvikvm(11142): at android.graphics.Bitmap.createBitmap(Bitmap.java:726) I/dalvikvm(11142): at android.graphics.Bitmap.createBitmap(Bitmap.java:703) I/dalvikvm(11142): at android.graphics.Bitmap.createBitmap(Bitmap.java:636) I/dalvikvm(11142): at com.squareup.picasso.BitmapHunter.transformResult(BitmapHunter.I/dalvikvm(11142): at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:168) I/dalvikvm(11142): at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:111) I/dalvikvm(11142): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:390I/dalvikvm(11142): at java.util.concurrent.FutureTask.run(FutureTask.java:234) I/dalvikvm(11142): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.I/dalvikvm(11142): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.I/dalvikvm(11142): at java.lang.Thread.run(Thread.java:841) I/dalvikvm(11142): at com.squareup.picasso.Utils$PicassoThread.run(Utils.java:408) 

  • Android - Comment définir une mise en page semi-transparente?
  • AlertDialog Android avec vue personnalisée: obtenez des données d'entrée
  • Session 'application': erreur Activation de lancement
  • FFMPEG avec support de codec matériel
  • Comment développer une application Reality Augmented pour Android
  • NoClassDefFoundError avec Android Studio sur Android 4
  • 4 Solutions collect form web for “Bibliothèque Picasso – Mémoire insuffisante”

    Votre code d'origine était le téléchargement de l'image complète, le chargement de l'image complète dans la mémoire, puis la mise à l'échelle de l'image de l'Android pour s'adapter à votre ImageView .

    Dans ce cas, vous n'avez pas besoin de l'image complète en mémoire – vous avez besoin de quelque chose de plus proche de la taille de ce qu'est l' ImageView .

    fit() sur Picasso. Il utilise inSampleSize sur BitmapFactory.Options pour BitmapFactory.Options l'image en cours de chargement dans la mémoire, pour obtenir quelque chose autour de la taille de l' ImageView , ce qui permet à Android d'étendre à partir de là. Cela réduira considérablement l'empreinte mémoire de chaque image, en particulier selon la taille d'un ImageView vous utilisez.

    Faites attention avec .fit ()!

    Il est préférable de server les bonnes tailles d'image du serveur, en envoyant la largeur de l'écran du périphérique au serveur et en servant l'image appropriée pour le périphérique. De cette façon, vous n'avez pas besoin de mise à niveau.

    Toutes les autres réponses sont bonnes lorsque vous mentionnez .fit ().

    Je pense qu'il peut être intéressant de mentionner l'inconvénient de .fit:

    Fit () mesure les dimensions de l'ImageView cible et utilise intérieurement le redimensionnement () pour réduire la taille de l'image aux dimensions de ImageView. Il y a deux choses à savoir sur l'ajustement (). Tout d'abord, call fit () peut retarder la demande d'image car Picasso doit attendre jusqu'à ce que la taille de l'ImageView puisse être mesurée. Deuxièmement, vous ne pouvez utiliser que fit () avec ImageView comme cible (nous allons voir d'autres cibles plus tard).

    L'avantage est que l'image est à la résolution la plus basse possible, sans affecter sa qualité. Une résolution inférieure signifie moins de données à retenir dans le cache. Cela peut considérablement réduire l'impact des images dans l'empreinte mémoire de votre application. En résumé, si vous préférez un impact de mémoire plus faible sur un temps de chargement un peu plus rapide, fit () est un excellent outil.

    TLDR:

    • Peut être utilisé uniquement avec des objectifs ImageView
    • Peut ralentir le chargement

    Source: https://futurestud.io/tutorials/picasso-image-resizing-scaling-andfitfit

    J'aimerais bien

     Picasso.with(mContext).load(getUrl()).fit().placeholder(R.drawable.placeholder) .into(viewholder.image); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.