您的位置:首页 > 其它

Volley的图片加载三种方法

2016-12-31 17:04 246 查看
Volley中Request常用请求有三种:StringRequest,JsonRequest,ImageRequest,而用Volley加载网络图片时,其自身就封装有ImageLoader,它不仅对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求.值得一提的是,为什么volley适合频繁的网络请求,不适合文件上传等大数据请求呢?那是因为每次添加request会做缓存 如果文件太大会照成oom,如果要解决这个问题,看源码其实我们还有一个办法,就是添加request之前把requests设置request.setShouldCache(false),对于用法来说 是很不方便的事情。想来这也是volley方法中没有上传图片方法的原因吧。

下面是Volley的三种加载图片方式:

1.Volley的ImageRequest方式:

RequestQueue mQueue = Volley.newRequestQueue(context);
ImageRequest imageRequest = new ImageRequest(
"http://developer.android.com/images/home/aw_dac.png",
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
imageView.setImageBitmap(response);
}
}, 0, 0, Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
imageView.setImageResource(R.drawable.default_image);
}
});
mQueue.add(imageRequest);


2.Volley的ImageLoader方式:

ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache(图片缓存设置));
ImageListener listener=ImageLoader.getImageListener(imageView,R.drawable.default_image,R.drawable.failed_image);
imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",listener, 200, 200);
public class BitmapCache implements ImageCache {

private LruCache<String, Bitmap> mCache;
public BitmapCache() {
int maxSize = 10 * 1024 * 1024;  //10M或用Runtime.getRuntime().maxRemember()/8;
mCache = new LruCache<String, Bitmap>(maxSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
}

@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}

@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap);
}
}

ImageListener listener =ImageLoader.getImageListener(imageView,R.drawable.default_image,R.drawable.failed_image);


3.NetworkImageView的用法:

先创建一个RequestQueue对象,再创建一个ImageLoader对象,然后进行下边代码:

<com.android.volley.toolbox.NetworkImageView
android:id="@+id/network_image_view"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_gravity="center_horizontal"
/>

然后在代码中设置:
networkImageView = (NetworkImageView) findViewById(R.id.network_image_view);
networkImageView.setDefaultImageResId(R.drawable.default_image);
networkImageView.setErrorImageResId(R.drawable.failed_image);
networkImageView.setImageUrl("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",imageLoader);


注意:

手机内存大小的局限性,AOSP的现行标准是,以720P的手机来说,若手机自身带有1G内存,则每个应用可用内存限制在96MB。若有2G内存,则限制为192MB(即占不到总内存的1/10),一旦某个应用总体使用的内存超过了所在手机的限制,将引发OOM(Out of Memory)错误.

小结:

Volley中图片压缩问题:使用ImageRequest和ImageLoader这两种方式来加载网络图片,都可以传入一个最大宽度和高度的参数来对图片进行压缩,而NetworkImageView中则在加载图片的时候它会自动获取NetworkImageView自身的宽高,然后对比网络图片的宽度,再决定是否需要对图片进行像素压缩。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图片