还是挺好用的
我还是挺喜欢用Volley的
挺方便
比如我们经常用的
StringRequest
JsonObjectRequest
JsonArrayRequest
ImageRequest
得到JSONObject
当然就要解析了
我们平时解析有很多第三方库
比如GSON,FastJson等等
但是我们现在不是慢慢对每个response解析
而是自定义一个FastJsonRequest
在这个自定义请求里面直接解析,
请求成功之后就得到解析后的对象
先把fastjson-1.2.4.jar放到libs里面
Add As Library一下
这个fastjson是阿里开发的,是国产的,
据说github上面国产的前100名几乎都是阿里的.
public class FastJsonRequest extends Request{
}
@Override
protected Response parseNetworkResponse(NetworkResponse response) {
return null;
}
@Override
protected void deliverResponse(Object response) {
}
这里系统可能会提示还要实现一个compareTo方法,不用管
public FastJsonRequest(String url, Response.ErrorListener listener) {
super(url, listener);
}
public FastJsonRequest(int method, String url, Response.ErrorListener listener) {
super(method, url, listener);
}
实现的两个方法
1.parseNetworkResponse
2.deliverResponse
@Override
protected Response
String parsed;
try {
parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException e) {
parsed = new String(response.data);
}
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}
首先,返回类型是一个Response
方法的参数是(NetworkResponse response),
然后定义了一个String parsed;
trycatch捕捉UnsupportedEncodingException 不支持的编码异常
没出错,
parsed=new String(response.data, HttpHeaderParser.parseCharset(response.headers));
出错了,
parsed = new String(response.data);
最后返回
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
但是我们可以看出来,这个String parsed
就是我们需要解析的字符串
我们先不管,把这段代码复制过来,放到我们的parseNetworkResponse方法里面
刚才说了,我们现在要把解析的过程放到我们的这个FastJsonRequest自定义请求里面
所以我们就把解析的过程放在这个方法里面执行
JSON.parseObject(parsed,???);
第二个参数本来是我们存放解析结果的bean类
但是现在我们的这个FastJsonRequest自定义请求是通用的
所以我们不知道要用什么bean类来接收
所以我们就用动态的字节码对象来表示
同时我们要用泛型来动态控制
public class FastJsonRequest
private Class
@Override
protected Response parseNetworkResponse(NetworkResponse response) {
String parsed;
try {
parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException e) {
parsed = new String(response.data);
}
T t=JSON.parseObject(parsed, mClazz);
return Response.success(t, HttpHeaderParser.parseCacheHeaders(response));
}
返回的时候还要把t对象传出去
里面是
private final Listener
@Override
protected void deliverResponse(String response) {
mListener.onResponse(response);
}
所以泛型改成T
private final Listener
@Override
protected void deliverResponse(T response) {
mListener.onResponse(response);
}
两个构造方法都只有Response.ErrorListener,
我们平时用的时候当然是有Response.Listener的,所以我们把Listener放进去
public FastJsonRequest(String url, Response.Listener
super(url, listener);
mListener=successListener;
}
public FastJsonRequest(int method, String url, Response.Listener
super(method, url, listener);
mListener=successListener;
}
public FastJsonRequest(String url, Response.Listener
super(url, listener);
mListener = successListener;
mClazz=clazz;
}
public FastJsonRequest(int method, String url, Response.Listener
super(method, url, listener);
mListener = successListener;
mClazz=clazz;
}
其实我们的过程很简单,几乎就是和StringRequest一模一样
只不过我们有2个区别
第一是我们加入了解析过程
第二是我们把
还有就是我们要加上参数
1个Listener和1个Class
一个是本来就需要的,成功请求后的回调
一个是我们需要的动态的字节码对象
String url="http://000.000.000.000/file/product.json";
FastJsonRequest
@Override
public void onResponse(ProductBean response) {
mTv.setText(response.data.get(0).name);
}
}, ProductBean.class, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
mTv.setText("fail");
}
});
RequestQueue requestQueue = Volley.newRequestQueue(getContext());
requestQueue.add(productFastJsonRequest);