我正在使用通用图片加载器,每天用户遇到的无法加载的图片数量相当大。 我正在使用以下代码将错误信息发送到分析系统。
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
try
{
String fail = failReason.getType().toString();
String fail4 = failReason.getCause().toString();
String sum = fail + " " + fail4;
EasyTracker.getTracker().sendException(sum, false);
}
catch (Exception e)
{
EasyTracker.getTracker().sendException(e.getMessage(), false);
}
}
大多数情况下,它会捕获异常(例如getType或getCause为空)。此问题在2.1-2.3 Android版本的设备上出现,但也有一些来自较新版本(如4.0.4甚至4.2.2)的报告。所以我不能确定导致图像加载失败的原因。
另一个问题是IO_ERROR java.io.EOFException
,这在较新的Android版本上经常出现。
前三个最常见的错误是内存不足错误... 我尝试加载的图像大小不超过1MB,但我需要使用ScaleType.Exactly,而在加载更大的图像时,我没有将它们缓存在内存或磁盘中,以减少内存不足的可能性,但仍然经常发生。
我的配置:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(xxx.getApplicationContext())
.threadPoolSize(4)
.memoryCache(new WeakMemoryCache())
.imageDownloader(new BaseImageDownloader(xxx.getApplicationContext(),10 * 1000, 30 * 1000))
.build();
if(!ImageLoader.getInstance().isInited())
ImageLoader.getInstance().init(config);
// options is used for images smaller in size (5kb-150kb)
options = new DisplayImageOptions.Builder()
.cacheInMemory()
.cacheOnDisc()
.showStubImage(R.drawable.stub)
.showImageOnFail(R.drawable.failed)
.imageScaleType(ImageScaleType.EXACTLY)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
// options2 is used for images big in size (300kb-1,2mb)
options2 = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.stub)
.showImageOnFail(R.drawable.failed)
.imageScaleType(ImageScaleType.NONE) // NONE because I need to have full size bitmap loaded
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
有人能告诉我如何优化我的图像加载,以减少加载失败的图片吗?因为我觉得这些不断的加载失败会让我失去一些用户。
更新
按照nostra在onLoadingFailed
中建议的更改代码后,我现在看到所有没有.getCause()
的报告都是“DECODING_ERROR”,而且所有这些报告都是由android 2.2-2.3.6版本报告的,没有来自更新版本。然而,我的大部分用户仍在使用旧版android,有什么办法可以减少这种解码错误吗?我在旧版android上亲自检查了应用程序,图片大多数情况下确实加载了,但在分析报告中最常见的仍然是IO_ERROR java.io.EOFException
。
更新2
按照nostra的建议,定制了下载器,将线程池大小减小到3,设置了额外的加载-如果加载失败,请再尝试加载一次,然后放弃。我看到加载失败的情况减少了约30%。但仍然存在-每天500个活跃用户中有100个解码错误(仅限于2.2-2.3.6版本),160个EOF错误(4.0及以上)。
更新3
最新更新的版本解决了很多解码错误和EOFExceptions,我认为主要是因为我在第一次加载失败后尝试重新加载相同的图像。不过...现在我面临另一个问题:设备上没有剩余空间java.io.IOException: write failed: ENOSPC (No space left on device)
。我正在使用LimitedDiscCache。