在了解了搭建框架的原则之后。我们就一步步从常用的几个功能模块来开始搭建。

      首先,也是最重要,最经常使用的一个模块:Http请求。几乎可以说除了离线应用和游戏。90%以上的app都需要请求服务器来获取数据进行展示。Http是我们开发应用接触多的一个功能模块。从使用频率以及重要性来说,它都是优先级最高的一个操作。因此,我们需要选择一个效率足够高,并且能够管理的好的http请求库来使用。

选择

      这里,我们列举出目前github最为出色的几个库,提供给大家选择。当然,如果大家有更好的库推荐,也可以提供给楼主补充。

      1.Volley

            Volley是google官方在2013年Google I/O大会开源的一个Http请求库。其集合了http请求与网络图片加载缓存的功能于一身。成为google大力推荐使用的库。并且,它能够自动根据所运行的系统版本。自动选择使用HttpClient还是HttpUrlConnection。并且由于Volley的结构是使用接口话编程的框架。使其具有十分强大的扩展性。任何你想要修改的地方都可以使用接口继承的方式来自定义实现。Volley还针对网络及缓存做了相关的队列管理,能够很好的对其中的线程进行优先级排序以及取消等操作。

            下载地址:https://android.googlesource.com/platform/frameworks/volley  

      2.AsyncHttpClient

            AsyncHttpClient是github使用量很大的一个http请求库。其封装了强大的异步线程池来实现http请求。并且提供了大量常用的使用方式。特别是实现了文件上传下载的功能。只需要简单的几句调用就能够实现以往复杂的文件下载上传操作。不过由于其底层实现使用的是HttpClient。目前Google已经不推荐使用HttpClient在2.3以上版本使用。在5.1源码之后还删除了HttpClient部分的源码。因此如果你要使用AsyncHttpClient。需要注意将引用的部分使用Apache引入的jar库来使用。

            下载地址:https://github.com/loopj/android-async-http

      3.OKHttp

            OKHttp是国外知名的科技公司Square出品的开源http请求库。Square在开源界是神一般的存在,他们为我们提供了太多强大的库。甚至很多库都被google集成到源码中去使用。OKHttp便是其中一个,在新版本的android源码中,已经使用OKHttp替代了HttpUrlConnection的实现,它提供了与HttpUrlConnection一样的功能和api。能够让我们快速的上手使用。并且从请求效率上来说。OKHttp是无人能匹敌的。这也是Google选择它集成到源码中替代原有实现的原因。

            下载地址:https://github.com/square/okhttp      

      那么。这么多的库,选择哪一个更合适呢。这个就需要大家自己根据自己的需求去选择了。在了解过各个库的优缺点之后。大家可以任意选择一个库进行封装。这里,我个人推荐一种组合方案。使用Volley+OKHttp。Volley来实现队列管理调度。OKHttp来实现http的实现部分。这样,利用两者的优点结合,相信能够有一个很好的效果。

封装

      不管你选择的是哪一个库。最重要的就是要封装好一个统一的接口。这样可以避免你在替换底层实现库的时候因为更换的库实现api差距很大而需要做大量的改动。

      这里,我提供一个案例:

public void doPost(final Context mActivity,String url, final Map<String,String> param, final OnHttpListenner mListner, final boolean showProgress){

        StringRequest stringRequest = new StringRequest(Request.Method.POST,url,new Response.Listener<String>(){

            @Override
            public void onResponse(String s){
               
                try{
                    BaseRequestEntity result=JSON.parseObject(s, BaseRequestEntity.class);
                    
                    try {
                        mListner.OnSuccess(result);
                    } catch (PackageManager.NameNotFoundException e) {
                        e.printStackTrace();
                    }
                }catch (Exception ex){
                    ToastUtil.showShort(mActivity,"请求异常,请稍后重试");
                    
                }


            }
        },new Response.ErrorListener(){
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                mListner.OnError();
                

            }
        }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                param.put("venue","1");
                
                return param;
            }
        };
        stringRequest.setRetryPolicy(new DefaultRetryPolicy(
                60000,
                1, 1.0f));
        mRequestQueue.add(stringRequest);
    }

在这个方法里默认使用的是post方式请求。参数封装为map传递进来。接入到Volley的getParams中。提供Context,url,是否显示加载框,最重要的是,通过OnHttpListenner回调来渗透到http请求的各个声明周期。方便外部做相关阶段的自定义处理。

17 1

共收到1条回复

极客学院-shao 862天前 #1楼

楼主你是来挖坑滴么~~

0 评论

加入小组与大家一起讨论吧