我有一个应用程序需要显示全屏图像,我从drawable文件夹获取图像,它们像150-250 kb但它仍然崩溃并给出OutOfMemory错误。当然不是第一张图片,但每次用户启动应用程序时我都会加载不同的图像。
当我检查缓存文件夹时,我看到图书馆缓存的图像大约为700-800 kb,不像我的那么小。所以有一些关于缓存的东西。我该如何防止这种情况发生?
这是我的配置:
DisplayImageOptions options = new DisplayImageOptions.Builder()
.resetViewBeforeLoading(true)
.cacheOnDisc(true)
.cacheInMemory(true)
.displayer(new FadeInBitmapDisplayer(300))
.imageScaleType(ImageScaleType.EXACTLY)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this)
.defaultDisplayImageOptions(options)
.build();
ImageLoader.getInstance().init(configuration);
第二个问题:什么是默认缓存限制?或者有没有?我应该指定自己吗?因为我不希望将所有图像保存在缓存中,请假设我还将使用库从互联网加载图像,而不仅仅是从drawable中加载图像。
编辑:我发现this page解释了很多,但我发现默认情况下库使用UnlimitedDiscCache并提供更快的缓存...现在我有一个两难的困境更快的缓存(这在我的应用程序中非常重要)或缓存大小有限并且保存用户手动清除缓存文件夹......它应该是什么?
编辑2:这是OutOfMemory stackTrace:
E/dalvikvm-heap(17258): Out of memory on a 25600016-byte allocation.
I/dalvikvm(17258): "uil-pool-1-thread-2" prio=4 tid=14 RUNNABLE
I/dalvikvm(17258): | group="main" sCount=0 dsCount=0 obj=0x428941b0 self=0x59672008
I/dalvikvm(17258): | sysTid=17620 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1572156040
I/dalvikvm(17258): | schedstat=( 104225123 75715335 52 ) utm=10 stm=0 core=0
I/dalvikvm(17258): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
I/dalvikvm(17258): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:623)
I/dalvikvm(17258): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:476)
I/dalvikvm(17258): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:781)
I/dalvikvm(17258): at android.content.res.Resources.loadDrawable(Resources.java:1963)
I/dalvikvm(17258): at android.content.res.Resources.getDrawable(Resources.java:672)
I/dalvikvm(17258): at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStreamFromDrawable(BaseImageDownloader.java:188)
I/dalvikvm(17258): at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStream(BaseImageDownloader.java:85)
I/dalvikvm(17258): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.downloadImage(LoadAndDisplayImageTask.java:319)
I/dalvikvm(17258): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryCacheImageOnDisc(LoadAndDisplayImageTask.java:298)
I/dalvikvm(17258): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:241)
I/dalvikvm(17258): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:141)
I/dalvikvm(17258): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
I/dalvikvm(17258): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
I/dalvikvm(17258): at java.lang.Thread.run(Thread.java:856)
A/libc(17258): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 17620 (uil-pool-1-thre)
编辑3:
问题解决了,请看我自己的答案。但我接受了Delblanco的回答,因为它更有效率。
答案 0 :(得分:4)
如果可能,您应该使用从drawable文件夹显示图像的本机方式。 Source
答案 1 :(得分:0)
25600016字节,是您要求加载到内存中的25 Mb,或等同于ARGB_8888
Bitmap.Config
的6 mp像素图像。这是加载大的方法,你需要缩减采样(见inSampleSize)并阅读this。在您的情况下,您应该 UIL 来缩小图像。我还看到你明确地将Bitmap.Config
设置为RGB_565
,这意味着你实际上正在处理更大的图像,12 mpixel图像?
答案 2 :(得分:0)
我已经解决了这个问题。问题是我以前把图像放到drawable
文件夹中。图像真的很大,比如1000 * 1600px,所以我将它们移动到drawable-xxhdpi
文件夹中,不知何故OutOfMemory错误消失了。知道为什么吗?