Volley 简单使用(一) StringRequest

Volley是Google官方发布的一款用于Android的HTTP库,旨在进行网络请求时更快更简单,适用于数据量不大的请求。

优点

  1. 自动调度网络请求。
  2. 多个并发网络连接。
  3. 具有标准HTTP 缓存一致性的透明磁盘和内存响应缓存 。
  4. 支持请求优先级。
  5. 取消请求API。可以取消单个请求,也可以设置要取消的请求块或范围。
  6. 易于定制,例如,重试和退避。
  7. 强大的排序功能,可以使用从网络异步获取的数据轻松正确填充UI。
  8. 调试和跟踪工具

缺点

因为Volley在解析期间将所有数据保存在内存中,所以不适合大型下载或流式操作。

使用

创建RequestQueue

Volley通过RequestQueue进行请求,创建RequestQueue对象有两种方法
方式一:

1
RequestQueue queue = Volley.newRequestQueue();

方式二:

1
2
RequestQueue queue = new RequestQueue();
queue.start();

进行StringRequest请求

Volley本身就已经封装好了多个Request,StringRequest就是其中一个,如果返回的数据是String类型的话,直接使用StringRequest就可以很方便地发起请求。
StringRequest的两个构造函数:

1
2
3
4
5
6
7
public StringRequest( int method, String url, Listener<String> listener, @Nullable ErrorListener errorListener){
super(method, url, errorListener);
mListener = listener;
}
public StringRequest( String url, Listener<String> listener, @Nullable ErrorListener errorListener){
this(Method.GET, url, listener, errorListener);
}

method为请求方式,Volley支持GET、POST、PUT、DELETE等,从代码中可以看出,如果不指定method的情况下,StringRequest默认使用GET进行请求

Listener回调为请求成功时返回的回调,而返回的数据直接就是String类型

1
2
3
4
> public interface Listener<T> {
> void onResponse(T response);
> }
>

ErrorListener回调为请求过程中发生异常时的回调

1
2
3
4
> public interface ErrorListener {
> void onErrorResponse(VolleyError error);
> }
>

最后使用RequestQueue.add()发起请求

GET请求

GET为默认的请求方式,因此method可以指定,也可以不指定
示例:

1
2
3
4
5
6
7
8
Response.Listener<String> mResultListener = response -> {
Log.i("Result", response);
};
Response.ErrorListener mErrorListener = error -> {
Log.i("Error", error.getMessage());
};
StringRequest stringRequest = new StringRequest(URL_GET, mResultListener, mErrorListener);
mQueue.add(stringRequest);

POST请求

进行POST请求时必须指定method为POST
示例:

1
2
StringRequest stringRequest = new StringRequest(Request.Method.POST, URL_POST, mResultListener, mErrorListener);
mQueue.add(stringRequest);

POST设置Param或者Header

StringRequest并没有提供设置Param或者Heard而的方法,需要调用其父类Request的getParam()和getHeaders()来进行设置。

1
2
3
4
5
6
protected Map<String, String> getParams() throws AuthFailureError {
return null;
}
public Map<String, String> getHeaders() throws AuthFailureError {
return Collections.emptyMap();
}

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
StringRequest stringRequest = new StringRequest(Request.Method.POST, URL_POST, mResultListener, mErrorListener) {
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<>();
params.put("username", "123");
params.put("password", "456");
return params;
}

@Override
public Map<String, String> getHeaders() {
Map<String, String> headers = new HashMap<>();
headers.put("username", "789");
headers.put("password", "987");
return headers;
}
};

如果在GET请求中使用getParams()是没有作用的,如果需要添加参数可直接拼接在链接中

取消请求

Volley支持对指定请求进行取消
首先需要为Request设置TAG,然后才能取消该TAG对应的Request
为Request设置TAG:

1
2
3
4
5
private static final String TAG = "TAG";
StringRequest stringRequest = new StringRequest(Request.Method.GET, URL_GET, mResultListener, mErrorListener);
// 为Request设置TAG
stringRequest.setTag(TAG);
mQueue.add(stringRequest);

取消对应TAG的Request

1
mQueue.cancelAll(TAG);