jeffrey1995/MyBlog

Android-Volley的基本用法

jeffrey1995 opened this issue · 0 comments

关于volley的介绍不说了,直接讨论一下volley的几种用法。

1.将volley的库导入到自己的工程。(记得开启工程的网络权限)

image

2.初始化请求池。

在application实例一个RequestQueue单例,并提供一个get方法来获取。
image

3.网络请求

有三种常见请求类型:StringRequest、ImageRequest、JsonRequest

3.1 StringRequest

首先创建一个StringRequest实例,构造函数中三个参数分别为:http请求方式:Get/Post,请求url,请求成功监听器(Response.Listener),请求错误监听器(Response.ErrorListener)。然后将request对象设置好Tag标记(方便以后针对性的取消请求),将request放入请求队列中。

Get请求方式:
image

如果是Post方式,需要覆盖getParams()函数来想服务器提交参数。如下:
image

3.2ImageRequest

请求图片的方式有三种,ImageRequest是标准方法。还有ImageLoader和NetworkImageView。

ImageRequest:
image
第一个参数是图片的url,第二个是结果的listener,第三、第四个参数是maxWidth(最大宽度) 和 maxHeight(最大高度),你可以设置为0来忽略他们。然后是用于计算图片所需大小的ScaleType,然后是用于指定图片压缩方式的参数,我建议总是使用 Bitmap.Config.ARGB_8888,最后是一个错误listener。

注意Volley默认会将这种请求的优先级设置为low。

ImageLoader:
image
lruCache是用来缓存图片的,参数是图片的规格,因为在方法内部类中使用,所以定义成final类型。
覆写imageLoader的getBitmap和setBitmap方法来读写本地图片缓存。
创建ImageLoader,定义ImageListener,ImageLoader.get方法中传入图片url和listener。

NetworkImageView:
可以直接在xml中将图片控件定义成NetworkImageView,在属性里设置图片url。

3.3JsonRequest

String url = "http://httpbin.org/get?site=code&network=tutsplus";

JsonObjectRequest jsonRequest = new JsonObjectRequest
(Request.Method.GET, url, null, new Response.Listener() {
@OverRide
public void onResponse(JSONObject response) {
// the response is already constructed as a JSONObject!
try {
response = response.getJSONObject("args");
String site = response.getString("site"),
network = response.getString("network");
System.out.println("Site: "+site+"\nNetwork: "+network);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });

Volley.newRequestQueue(this).add(jsonRequest);

方法跟StringRequest类型,只是在onRequest的时候可以直接返回JSON对象。如果你需要,你还可以请求JSONArray ,只需用JsonArrayRequest 替代aJsonObjectRequest就可以了。

4.取消请求

@OverRide
protected void onStop() {
super.onStop();
mRequestQueue.cancelAll(new RequestQueue.RequestFilter() {
@OverRide
public boolean apply(Request<?> request) {
// do I have to cancel this?
return true; // -> always yes
}
});
}
这样你就不必担心在onResponse被调用的时候用户已经销毁Activity。这种情况下会抛出NullPointerException异。但是post请求则需要继续,即使用户已经改变了Activity。我们可以通过使用tag来做到,在构造GET请求的时候,添加一个tag给它。

// after declaring your request
request.setTag("GET");
mRequestQueue.add(request);

如果要取消GET请求,只需简单的添加下面的一行代码:

mRequestQueue.cancelAll("GET");

这样你就只会取消GET请求,让其它请求不受影响。注意你必须手动在销毁的Activity中处理这种情况。