Volley非常适合去进行数据量不大,但通信频繁的网络操作。
Volley提供了如下的便利功能:
1.JSON数据和图像等的异步下载;
2.网络请求排序(scheduling);
3.网络请求优先级处理;
4.缓存;
5.多级别取消请求;
6.与Activity生命周期联动(Activity结束时同时取消所有网络请求);
使用Volley进行网络请求分为三步
1.创建请求队列Volley.newRequestQueue(context);
2.构建请求对象 Request ,填入具体请求信息。
3.将请求对象加入请求队列中,开始执行网络请求。
1.使用StringRequest发送请求
private void testFunc()
{
RequestQueue volleyQue= Volley.newRequestQueue(getContext());
StringRequest stringRequest=new StringRequest(Request.Method.GET, "www.baidu.com", new Response.Listener<String>() {
@Override
public void onResponse(String s) {
textView.setText(s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
volleyQue.add(stringRequest);
}
2.使用JsonRequest发送请求
JsonRequest是抽象类,实现了两个子类JsonObjectRequest和JsonArrayRequest,前者用于请求一段Json数据,后者用于请求Json数组。
JsonObjectRequest jsonObjectRequest=new JsonObjectRequest("www.baidu.com", null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
textView.setText(jsonObject.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
调用Request对象的cancel()方法可以取消请求,Request可以添加Tag,通过setTag(tag)设置Tag,请求队列通过RequestQueue.cancel(tag)取消请求。
3.使用ImageRequest请求图片
ImageRequest imageRequest=new ImageRequest("http://seopic.699pic.com/photo/40007/4482.jpg_wh1200.jpg", new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
imageView.setImageBitmap(bitmap);
}
}, 0, 0, Bitmap.Config.ALPHA_8, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
volleyQue.add(imageRequest);
ImageRequest的构造函数有六个参数,第一个参数是图片URL;第二个参数是图片请求成功的回调;第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩;第五个参数用于指定图片深度;第六个参数是图片请求失败的回调
4.使用ImageLoader请求图片
ImageLoader imageLoader=new ImageLoader(volleyQue, new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String s) {
return null;
}
@Override
public void putBitmap(String s, Bitmap bitmap) {
}
});
ImageLoader.ImageListener listener=ImageLoader.getImageListener(imageView,R.drawable.default,R.drawable.default);
imageLoader.get("http://seopic.699pic.com/photo/40007/4482.jpg_wh1200.jpg",listener);
5.Volley执行过程
Volley的执行过程如图。
volley.jpg.png
RequestQueue会维护一个缓存调度线程(cache线程)和一个网络调度线程池(net线程),当一个Request被加到队列中的时候,cache线程会把这个请求进行筛选:如果这个请求的内容可以在缓存中找到,cache线程会亲自解析相应内容,并分发到主线程(UI)。如果缓存中没有,这个request就会被加入到另一个NetworkQueue,所有真正准备进行网络通信的request都在这里,第一个可用的net线程会从NetworkQueue中拿出一个request扔向服务器。当响应数据到的时候,这个net线程会解析原始响应数据,写入缓存,并把解析后的结果返回给主线程。
网友评论