关于Volley的简单封装
在Android开发中,volley几乎人人都会用(可能有些大神网络请求框架是自己写的,我就不知道了,没接触过),毕竟官方的东西,强大之处不多说,源码有多高能我也不说了,网上很多前辈的分析;
这里主要的就是降Volley封装成工具类,方便日常使用;
注:json解析我用的是GSON,这个可以根据个人喜好自己选,反正都一样;
主要用到的:StringRequest,接口回调,Gson,网络状态判断,sharedpreference
初始化就不多说了,把我们需要的参数实例化就好,其中isCache顾名思义就是你想让这次请求到的数据是否缓存到本地;
public NetWorkController(Context ctx, NetWorkCallBack callback,
boolean isCache) {
this.mContext = ctx;
this.mCallBack = callback;
canCache = isCache;
}
然后就是StringRequest的get和post请求,由于get挺简单,这里就简单的说一下post的请求,想看get直接文章末尾下载源码就好;(代码手贱格式化了一下,看不太懂的可以留言提问,其实没啥技术含量,应该都看得懂)
这里为什么用泛型类呢,就是通过这个泛型类配合gson达到解析通用的目的,这样每个接口的返回数据,你只要搭配好bean类就行了,代码中具体的解析只是我这json返回的格式所写,大家可以根据需求,进行修改;
里面还用到了网络判断的一个工具类,很简单就是系统提供的一个方法,这里就不贴出来了
public <T> void volleyPost(final String url, final Class<T> cls,final HashMap<String, String> map) {
StringRequest postRequest = new StringRequest(Method.POST, url,new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if(canCache){
SharedPreferencesUtil.saveCache(mContext, url, response);
}
Object json;
try {
JSONObject jo1 = new JSONObject(response);
mCallBack.respCode(jo1.getString("code"));
if (cls != null) {
json = new JSONTokener(jo1.getString("data")).nextValue();
if (json instanceof JSONObject) {
JSONObject obj = (JSONObject) json;
T entity = gson.fromJson(obj.toString(),(Class<T>) cls);
mCallBack.loadDone(entity);
} else if (json instanceof JSONArray) {//对于jsonarry的解析,可能有人会问,为啥不直接用gson自带的方法,而使用了一个循环,大家可以去试一下,这几个json解析工具无法解析泛型list
JSONArray ja = (JSONArray) json;
List<T> list = new ArrayList<T>();
for (int i = 0; i < ja.length(); i++) {
list.add(gson.fromJson(ja.get(i).toString(), cls));
}
mCallBack.loadDone(list);
}
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
// TODO Auto-generated method stub
return map;
}
};
if(NetWorkUtils.isNetworkConnected(mContext)){
HiveViewCNRApplication.getInstances().getQueue().add(postRequest);
}else{//如果网络环境不佳 读取这个json的缓存
String response=SharedPreferencesUtil.getCache(mContext, url);
if(response==null) return;
Object json;
try {
JSONObject jo1 = new JSONObject(response);
mCallBack.respCode(jo1.getString("code"));
if (cls != null) {
json = new JSONTokener(jo1.getString("data"))
.nextValue();
// json = new JSONTokener(response).nextValue();
if (json instanceof JSONObject) {
JSONObject obj = (JSONObject) json;
T entity = gson.fromJson(obj.toString(),
(Class<T>) cls);
mCallBack.loadDone(entity);
} else if (json instanceof JSONArray) {
JSONArray ja = (JSONArray) json;
List<T> list = new ArrayList<T>();
for (int i = 0; i < ja.length(); i++) {
list.add(gson.fromJson(ja.get(i)
.toString(), cls));
}
mCallBack.loadDone(list);
}
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
最后部分就是接口回调的接口了:
很简单 就不解释了
public interface NetWorkCallBack {
public <T> void loadDone(T entity);
public void respCode(String code);
public <T> void loadDone(List<T> list);
}
接下来是一个实际的例子:
post,map提前准备好,url怎么获取 大家可以自己考虑,我一般都写到常量类里;
public void Login(HashMap<String, String> map, String type) {
String url = String.format(ApiConstant.LOGINURL, HiveViewCNRApplication.getInstances().getApiKey(), type);
volleyPost(url, LoginEntity.class, map);
}
好了 现在最关键的就是我们怎么调用这个工具类里的方法了
- 实例化这个工具类的一个对象,由于形参里面包含接口对象,所以实例化的时候会自动生成接口类里的几个方法,这个就是一会接收结果用的;
- 用这个对象去调用我们工具类里写好的方法 比如上面那个Login()
- 看你们手上后台提供的接口文档,这个接口返回的数据是一个jsonobject还是一个jsonarray,从而在不同的接口回调里接收消息,比如这样:
controller=new NetWorkController(getActivity(), new NetWorkController.NetWorkCallBack() {
@Override
public void respCode(String code) {
// TODO Auto-generated method stub
}
@Override
public <T> void loadDone(List<T> list) {
// TODO Auto-generated method stub
Logger.e("==", "the anchor list :"+list);
lists=(ArrayList<AnchorEntity>) list;
adapter=new AnchorListAdapter(lists, getActivity());
anchorsList.setAdapter(adapter);
}
@Override
public <T> void loadDone(T entity) {
// TODO Auto-generated method stub
}
},true);
controller.getAnchorList();
好了 最后数据加载到ui就是你们的事情了;
PS:这个工具类的目的最开始就是让大家使用volley的时候不用每次都new一个Stringreuqest,不用每次都进行json解析,后来发现缓存也挺常用嘿!我就把缓存也加上了,如果能从这几个方面帮到大家,万分高兴!
额,github地址:https://github.com/arthasshi/volleyUtils/