Volley实现原理简述
一、介绍
Volley是Goole退出的Android异步网络请求框架和图片加载框架。
主要特点:
1)扩展性强。Volley大多是基于接口的设计。
2)符合Http规范。
3)Android2.3及以上版本默认基于HttpUrlConnection,2.3以下基于HttpClient。
4)提供简便的图片加载工具。
二、使用
1、调用:通过newRequestQueue()函数新建并启动一个请求队列,向RequestQueuezhon
不断add Request。
代码示例
public class MyApplication extends Application {
public static RequestQueue mQueue;
@Override
public void onCreate() {
super.onCreate();
mQueue = Volley.newRequestQueue(getApplicationContext());
}
public static RequestQueue getVolleyQueue() {
return mQueue;
}
}
2、使用示例:
StringRequest request = new StringRequest(Method.GET, tabUrl,
new Listener<String>() {
@Override
public void onResponse(String arg0) {
Gson gson = new Gson();
tEntity = gson.fromJson(arg0, TabEntity.class);
list = tEntity.getResult();
adapter = new PlayAdapter(tEntity, PlayerActivity.this);
lvPlay.setAdapter(adapter);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
}
});
request.setTag("abc");// 通过标签取消请求
MyApplication.getVolleyQueue().add(request);// 请求添加到请求队列中
3、post请求工具类
public class NormalPostRequest extends Request<JSONObject> {
private Map<String, String> mMap;
private Listener<JSONObject> mListener;
public NormalPostRequest(String url, Listener<JSONObject> listener, ErrorListener errorListener,
Map<String, String> map) {
super(Request.Method.POST, url, errorListener);
mListener = listener;
mMap = map;
}
// mMap是已经按照前面的方式,设置了参数的实例
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return mMap;
}
// 此处因为response返回值需要json数据,和JsonObjectRequest类一样即可
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
@Override
protected void deliverResponse(JSONObject response) {
mListener.onResponse(response);
}
}
四、优缺点:
优点:
1)自动调度网络请求。
2)用于多个并发的网络连接。
3)通过使用标准的Http缓存机制保持磁盘和内存响应的一致。
4)支持请求优先级。
5)支持取消请求的强大API,可以取消单个请求或多个。
6)易于定制。
7)健壮性:便于正确的更新UI和获取数据
8)包含调试和追踪工具。
缺点:
1)在BasicNetWork中判断了statusCode(statusCode < 200 || statusCode > 299),如何符合条件直接抛出IOException(),不够合理。
2)导致401等其它状态抛出IOException。
3)图片加载性能一般。