最近做项目用到了一个第三方包Android Universal Imageloader,这个包用来做图片异步加载相当方便缓存也做得挺不错的,但是实际用起来却会出现不少小问题。其实也不是小问题,只是这个组件的某些方法在设计上跟我们传统的思维有那么点小区别。
今天我在用displayImage方法加载图片的时候发现log报错:
11:09:56.861: E/ImageLoader(32085): UIL doesn't support scheme(protocol) by default [****/d***s/ba*****k/p****w.png]. You should implement this support yourself (BaseImageDownloader.getStreamFromOtherSource(...))
但是应用没死,只是图片无法显示了,细看错误提示发现我传入的URI地址不支持,需要用BaseImageDownloader提供的一个静态方法去从流获取……我表示很不解因为前些天传入http地址的时候都没问题今天从assets获取文件就出错了……想到这里断定是URI地址的问题,于是打开displayImage方法的源代码查看URL参数的说明:
@param uri Image URI (i.e. "http://site.com/image.png", "file:///mnt/sdcard/image.png")
源码给出了两个示例地址一个是http的一个是sd的,但两个地址都有一个共同的特点就是它们都是绝对路径,于是我也尝试在我的原路径前加上"assets//"表示从assets文件夹下获取:
"assets//d***s/ba*****k/p****w.png"
尝试了运行了一下果然没问题图片能正常显示说明确实是路径的问题,后来google了一下关于这个问题的一些东西在一老外的网站发现了同样的问题而且还给出了其他一些与此类似常用的URI:
String imageUri = "http://site.com/image.png"; // from Web
String imageUri = "file:///mnt/sdcard/image.png"; // from SD card
String imageUri = "content://media/external/audio/albumart/13"; // from content provider
String imageUri = "assets://image.png"; // from assets
String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch)