Image universelle de Chargeur de l'UIL nostra erreur de mémoire insuffisante
Je suis à l'aide de l'UIL pour charger des images à distance et de remplir des Fragments dans les FragmentStatePagerAdapter.
J'ai lu readme et les habituelles erreurs, mais je ne peux pas résoudre ce bug.
Voici la config:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.threadPoolSize(1)
.build();
ImageLoader.getInstance().init(config);
Voici où j'affiche mes images:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ImageLoader imgLoader = ImageLoader.getInstance();
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.loading)
.cacheOnDisc()
.resetViewBeforeLoading()
.bitmapConfig(Bitmap.Config.RGB_565)
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.build();
imgLoader.displayImage(this.contentImage, this.imgView, options);
return layout;
}
Et c'est là où je détruis mes fragments de la carte:
public void destroyItem(ViewGroup container, int position, Object object) {
if (position >= getCount()) {
container.removeAllViews();
FragmentManager manager = ((Fragment) object).getFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove((Fragment) object);
trans.commit();
}
}
et enfin ici c'est l'exception-je obtenir:
{
06-20 12:09:24.877: E/dalvikvm-heap(17043): Out of memory on a 6345504-byte allocation.
06-20 12:09:24.877: I/dalvikvm(17043): "pool-1-thread-1" prio=4 tid=16 RUNNABLE
06-20 12:09:24.877: I/dalvikvm(17043): | group="main" sCount=0 dsCount=0 obj=0x42593a48 self=0x6367e778
06-20 12:09:24.887: I/dalvikvm(17043): | sysTid=17091 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1667639656
06-20 12:09:24.887: I/dalvikvm(17043): | state=R schedstat=( 4021618000 2254117000 18267 ) utm=341 stm=61 core=0
06-20 12:09:24.887: I/dalvikvm(17043): #00 pc 00074350 /system/lib/libdvm.so (dvmDumpNativeStack(DebugOutputTarget const*, int)+35)
06-20 12:09:24.887: I/dalvikvm(17043): #01 pc 00062afe /system/lib/libdvm.so (dvmDumpThreadEx(DebugOutputTarget const*, Thread*, bool)+557)
06-20 12:09:24.887: I/dalvikvm(17043): #02 pc 00062bae /system/lib/libdvm.so (dvmDumpThread(Thread*, bool)+25)
06-20 12:09:24.887: I/dalvikvm(17043): #03 pc 000298ec /system/lib/libdvm.so (dvmMalloc(unsigned int, int)+584)
06-20 12:09:24.887: I/dalvikvm(17043): #04 pc 0007fdfe /system/lib/libdvm.so (dvmAllocPrimitiveArray(char, unsigned int, int)+93)
06-20 12:09:24.887: I/dalvikvm(17043): #05 pc 0005357e /system/lib/libdvm.so
06-20 12:09:24.887: I/dalvikvm(17043): #06 pc 000798e0 /system/lib/libandroid_runtime.so (GraphicsJNI::allocateJavaPixelRef(_JNIEnv*, SkBitmap*, SkColorTable*)+67)
06-20 12:09:24.887: I/dalvikvm(17043): #07 pc 000799ae /system/lib/libandroid_runtime.so (JavaPixelAllocator::allocPixelRef(SkBitmap*, SkColorTable*)+45)
06-20 12:09:24.887: I/dalvikvm(17043): #08 pc 0004aa18 /system/lib/libskia.so (SkBitmap::allocPixels(SkBitmap::Allocator*, SkColorTable*)+56)
06-20 12:09:24.887: I/dalvikvm(17043): #09 pc 000cd848 /system/lib/libskia.so (SkPNGImageDecoder::onDecode(SkStream*, SkBitmap*, SkImageDecoder::Mode)+404)
06-20 12:09:24.887: I/dalvikvm(17043): #10 pc 000c9504 /system/lib/libskia.so (SkImageDecoder::decode(SkStream*, SkBitmap*, SkBitmap::Config, SkImageDecoder::Mode, bool)+168)
06-20 12:09:24.887: I/dalvikvm(17043): #11 pc 00075a08 /system/lib/libandroid_runtime.so
06-20 12:09:24.887: I/dalvikvm(17043): #12 pc 000762ac /system/lib/libandroid_runtime.so
06-20 12:09:24.887: I/dalvikvm(17043): #13 pc 0001dd8c /system/lib/libdvm.so (dvmPlatformInvoke+112)
06-20 12:09:24.887: I/dalvikvm(17043): #14 pc 0005a6e2 /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+165)
06-20 12:09:24.887: I/dalvikvm(17043): #15 pc 000271a0 /system/lib/libdvm.so
06-20 12:09:24.887: I/dalvikvm(17043): #16 pc 0002b898 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
06-20 12:09:24.887: I/dalvikvm(17043): #17 pc 00073d2c /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+563)
06-20 12:09:24.887: I/dalvikvm(17043): #18 pc 00073e04 /system/lib/libdvm.so (dvmCallMethod(Thread*, Method const*, Object*, JValue*, ...)+19)
06-20 12:09:24.887: I/dalvikvm(17043): #19 pc 000640f4 /system/lib/libdvm.so
06-20 12:09:24.887: I/dalvikvm(17043): #20 pc 0000dcfc /system/lib/libc.so (__thread_entry+124)
06-20 12:09:24.887: I/dalvikvm(17043): #21 pc 0000d8d0 /system/lib/libc.so (pthread_create+172)
06-20 12:09:24.887: I/dalvikvm(17043): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
06-20 12:09:24.887: I/dalvikvm(17043): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:529)
06-20 12:09:24.887: I/dalvikvm(17043): at com.nostra13.universalimageloader.core.ImageDecoder.decode(ImageDecoder.java:82)
06-20 12:09:24.887: I/dalvikvm(17043): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:270)
06-20 12:09:24.887: I/dalvikvm(17043): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:244)
06-20 12:09:24.887: I/dalvikvm(17043): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:149)
06-20 12:09:24.887: I/dalvikvm(17043): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
06-20 12:09:24.887: I/dalvikvm(17043): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
06-20 12:09:24.887: I/dalvikvm(17043): at java.lang.Thread.run(Thread.java:856)
06-20 12:09:24.897: D/skia(17043): --- decoder->decode returned false
06-20 12:09:24.897: E/ImageLoader(17043): null
06-20 12:09:24.897: E/ImageLoader(17043): java.lang.OutOfMemoryError
06-20 12:09:24.897: E/ImageLoader(17043): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
06-20 12:09:24.897: E/ImageLoader(17043): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:529)
06-20 12:09:24.897: E/ImageLoader(17043): at com.nostra13.universalimageloader.core.ImageDecoder.decode(ImageDecoder.java:82)
06-20 12:09:24.897: E/ImageLoader(17043): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:270)
06-20 12:09:24.897: E/ImageLoader(17043): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:244)
06-20 12:09:24.897: E/ImageLoader(17043): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:149)
06-20 12:09:24.897: E/ImageLoader(17043): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
06-20 12:09:24.897: E/ImageLoader(17043): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
06-20 12:09:24.897: E/ImageLoader(17043): at java.lang.Thread.run(Thread.java:856)
}
Je n'ai pas la moindre idée de comment le résoudre.
Les images chargées sont de taille variable. Ils peuvent varier de 500 KO à 1,5 MO.
- vérifier cela peut vous aider stackoverflow.com/questions/16789676/...
Vous devez vous connecter pour publier un commentaire.
https://github.com/nostra13/Android-Universal-Image-Loader.
À partir du lien ci-dessus
Si vous obtenez souvent
OutOfMemoryError
dans votre application à l'aide de Universal Chargeur d'Image puis essayer ensuite (toutes ou plusieurs):Réduire la taille du pool de threads dans la configuration (.threadPoolSize(...)). 1 - 5 est recommandé.
Utilisation
.bitmapConfig(Bitmap.Config.RGB_565)
dans les options d'affichage. Les Bitmaps dansRGB_565
consommer 2 fois moins de mémoire que dansARGB_8888
.Utilisation
.memoryCache(new WeakMemoryCache())
dans la configuration ou de désactiver la mise en cache dans la mémoire à tout dans les options d'affichage (ne pas l'appeler .cacheInMemory()).Utilisation
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
dans les options d'affichage. Ou essayez.imageScaleType(ImageScaleType.EXACTLY)
.Éviter d'utiliser RoundedBitmapDisplayer. Il crée un nouvel objet Bitmap avec ARGB_8888 config pour l'affichage pendant le travail.
Exemple: Modifier le c.ode dans le lien ci-dessous coller les points ci-dessus pour éviter OOM
La mise en cache des images et l'affichage
RÉSOLU:
Il n'était pas un UIL problème. Le problème était avec la page carte. Les images dans les Fragments n'étaient pas gérées correctement par le GC et il y a une certaine référence indirecte à les y maintenir. En libérant les images explicitement résolu le problème.
EDIT:
Ce n'était pas une bonne UIL problème. Je travaillais avec SupportFragment bibliothèque, et cela peut ne pas être correctement ajustés. Le truc pour moi c'était de valider manuellement chaque image qui n'était pas sur l'écran, mais le problème doit être étudié d'une manière différente. Cette application utilise une très grande quantité de WebViews, qui à mon avis sont mal en raison du fait que leur consommation de mémoire est tout simplement stupide! L'ajout de l'UIL avec salut-res images de mon appli va OOM en raison de la combinaison de ces facteurs.
C'est un peu empirique solution, mais il fonctionne vraiment.
J'ai de configuration suivantes avec
disk cache
. Je n'ai jamais été confrontés à un problème de OOM.Pour créer
cache dir
,