关于volley的简单封装并附带文件缓存

6 篇文章 0 订阅
2 篇文章 0 订阅

关于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);
    }

好了 现在最关键的就是我们怎么调用这个工具类里的方法了

  1. 实例化这个工具类的一个对象,由于形参里面包含接口对象,所以实例化的时候会自动生成接口类里的几个方法,这个就是一会接收结果用的;
  2. 用这个对象去调用我们工具类里写好的方法 比如上面那个Login()
  3. 看你们手上后台提供的接口文档,这个接口返回的数据是一个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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值