Bibliothèque Picasso - Mémoire
Je suis à l'aide de Picasso bibliothèque de la dernière version 2.4.0 dans mon application pour le téléchargement et la mise en cache des images. Il y a environ 25-30 images de taille de 300 ko-400KB chaque. Je pense que ce n'est nullement quelque chose de grand ou lourd.
Même si l'application est en cours d'exécution fine, je pars d'allocations de mémoire dans mon logcat. Quelqu'un peut-il expliquer pourquoi est-ce arrivé?
Code pour le chargement des images dans GridView adaptateur:
Picasso.with(mContext).load(getUrl()).placeholder(R.drawable.placeholder)
.into(viewholder.image);
Voici mon Logcat de sortie:
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)
source d'informationauteur Adeel Ahmad
Vous devez vous connecter pour publier un commentaire.
Original de votre code de téléchargement de l'image complète, chargement de l'image dans la mémoire, puis d'avoir Android échelle de l'image vers le bas pour s'adapter à votre
ImageView
.Dans ce cas, vous n'avez pas besoin de la totalité de l'image dans la mémoire -- vous avez besoin de quelque chose de plus proche en taille que le
ImageView
est.fit()
sur Picasso gère cela. Il utiliseinSampleSize
surBitmapFactory.Options
pour sous-échantillonner l'image telle qu'elle est chargée en mémoire, pour obtenir de vous quelque chose autour de la taille de laImageView
laissant Android échelle à partir de là. Cela permettra de réduire considérablement l'empreinte mémoire de chaque image, en particulier en fonction de la taille d'unImageView
vous utilisez.Regarder avec .ajustement()!
De son mieux pour le serveur de l'image de droite tailles à partir du serveur, par l'envoi de l'appareil largeur de l'écran vers le serveur, et de servir l'image de droite pour l'appareil. De cette façon, tou n'ont pas besoin de todo mise à l'échelle.
Tous les autres réponses sonne bien quand on fait allusion .ajustement().
Je pense qu'il peut être intéressant de mentionner à la baisse .ajustement:
TLDR:
Source: https://futurestud.io/tutorials/picasso-image-resizing-scaling-and-fit
Voudrais que ce