谷歌在2013年I/O大会上声明的框架。
特点
1. Volley的优势在于处理小文件的http请求;
2. Volley在处理高分辨率的图像压缩上有很好的支持;
3.内存和磁盘缓存;
4.debugging和tracing工具
5.获取json对象
6.自定义请求
7. NetworkImageView在GC的使用模式上更加保守,在请求清理上也更加积极,networkimageview仅仅依赖于强大的内存引用,并当一个新请求是来自ImageView或ImageView离开屏幕时 会清理掉所有的请求数据。
使用方法
volley请求是通过RequestQueue请求队列来进行管理的。
请求网络
- 创建一个RequestQueue请求队列
- 创建Request对象
- 将Request对象添加到RequestQueue中
private void get(){
RequestQueue queue= Volley.newRequestQueue(getApplicationContext());//创建一个单例的RequestQueue对象
String url="http://121.41.123.1/test/index.php";
StringRequest request=new StringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("TAG",response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
queue.add(request);
}
加载图片
RequestQueue queue = Volley.newRequestQueue(getApplicationContext()); String url = "https://www.baidu.com/img/bdlogo.png";
//第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。
//第五个参数就是ImageView里中的属性ScaleType
//第六个参数用于指定图片的颜色属性
ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
ImageView iv= (ImageView) findViewById(R.id.iv);
iv.setImageBitmap(response);
}
}, 0, 0, ImageView.ScaleType.CENTER, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
queue.add(request);
另外volley框架还对imageView控件进行了自定义,可以自动加载网络的图片。
只需要在布局文件中声明该控件后,然后设置要加载的图片就可以。
niv.setDefaultImageResId(R.mipmap.ic_launcher);//设置加载中显示的图片 niv.setErrorImageResId(R.mipmap.ic_launcher);//设置加载失败时显示的图片
niv.setImageUrl("https://www.baidu.com/img/bdlogo.png", loader);//设置目标图片的URL地址
自定义Request请求
- 继承Request
- 重写parseNetworkResponse
public class GsonRequest<T> extends Request<T> {
private final Response.Listener<T> mListener;
private Gson mGson;
private Class<T> mClass;
public GsonRequest(int method, String url, Class<T> clazz, Response.Listener<T> listener,
Response.ErrorListener errorListener) {
super(method, url, errorListener);
mGson = new Gson();
mClass = clazz;
mListener = listener;
}
public GsonRequest(String url, Class<T> clazz, Response.Listener<T> listener,
Response.ErrorListener errorListener) {
this(Method.GET, url, clazz, listener, errorListener);
}
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(mGson.fromJson(jsonString, mClass),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(T response) {
mListener.onResponse(response);
}
}
Volley框架本身架构的设计
- volley框架有一个主线程和一个缓存线程有多个网络线程。
- 每当有新请求的时候,就会把请求加到请求队列里面,当该请求无效时,就从该请求队列里面移除。
- 把请求的消息返回给主线程