ImageLoader 加载图片及注意事项
作为android加载图片的开源框架,com.nostra13.universalimageloader.core.ImageLoader给我们提供了很大的方便,但是在使用过程会产生一些问题,下面是我使用过程及其遇到的一些问题。
一、图片加载
1、ImageLoader.getInstance().displayImage(url, imageView);
参数
url:可以为网络图片、本地图片图片的路径,也可以是项目中文件路径,还可以是内容提提供者的路径;
1)网络图片
url = "http://image.zidingyi.com/search/1.png"; 即网络地址。
2)本地图片
url = "file:///mnt/sdcard/image.png";
3)项目中assets文件下图片
uri = "assets://image1.png";
4)项目中drawable文件下图片
uri = "drawable://" + R.drawable.ic_launcher;
5)内容提提供者中的图片
uri = "content://media/external/audio/albumart/1";
imageView:自己定义的ImageView对象;
从上面可以看出获取图片非常方便,而且都是异步加载。
2、我们不可以增加监听来判断图片的加载情况
ImageLoader.getInstance().displayImage(url, this, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
//图片形如加载,可以做一些提示操作
}
@Override
public void onLoadingFailed(String imageUri, View view,FailReason failReason) {
//图片加载失败
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
//图片加载成功,可以再次根据需求对图片进行处理
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
//图片加载取消
}
});
}
3、 还可添加参数DisplayImageOptions
ImageLoader.getInstance().displayImage(url, this, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
//图片形如加载,可以做一些提示操作
}
@Override
public void onLoadingFailed(String imageUri, View view,FailReason failReason) {
//图片加载失败
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
//图片加载成功,可以再次根据需求对图片进行处理
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
//图片加载取消
}
},displayImageOptions);
}
参数
displayImageOptions:可以通过以下方式设置
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.build();
二、防止OOM产生
产生的oom:
OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack available
java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack available
Failed to allocate a 32 byte allocation with 0 free bytes and 3GB until OOM
java.lang.OutOfMemoryError: Failed to allocate a 32 byte allocation with 0 free bytes and 3GB until OOM
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:634)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:610)
at com.nostra13.universalimageloader.core.decode.BaseImageDecoder.decode(BaseImageDecoder.java:83)
at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:265)
at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:223)
at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:136)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
解决方法:
1、设置DisplayImageOptions 中.cacheInMemory(false) ,让图片不缓存于内存中;
2、在DisplayImageOptions的.bitmapConfig中配置使用Bitmap.Config.RGB555
代替Bitmap.Config.ARGB8888,减少内存占用;
3、在ImageLoaderConfiguration的.memoryCache()中配置图片缓存为软缓存或弱缓存;
4、在DisplayImageOption中配置imageScaleType(ImageScaleType.IN_SAMPLE_INT);
5、在ImageLoaderConfiguration的.threadPoolSize中减少线程池中线程的个数,最好在5个以下。