android - 从可绘制文件夹加载图像时通用图像加载器 OOM?

标签 android caching image-processing out-of-memory universal-image-loader

我有一个需要显示全屏图像的应用程序,我从可绘制文件夹中获取图像,它们大约为 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);

第二个问题:默认缓存限制是多少?或者有没有?我应该指定自己吗?因为我不想将所有图像都保存在缓存中,所以请假设我还将使用库从互联网加载图像,而不仅仅是从可绘制的图像。

编辑:我刚刚发现 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 的回答,因为它更有效率。

最佳答案

如果可能,您应该使用 native 方式显示可绘制文件夹中的图像。 Source

关于android - 从可绘制文件夹加载图像时通用图像加载器 OOM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21039010/

相关文章:

android - 当我运行我的 android UIAutomator 代码时,它显示错误

分布式环境下的Java缓存

用于将 16 位图像合并为高动态范围图像的 Python 模块

ASP.NET 缓存 - 以编程方式使服务器缓存无效...示例中的困惑

android - Activity返回后缓存为空

python - 获取重复轮廓

image - 值(value)观的作用

Windows 7 的 AndroidViewClient 安装

android - menu.findItem(R.id.*) 为 null- Android

javascript - 在 iPhone 和 Android 上通过 JavaScript 检测手指滑动