zoukankan      html  css  js  c++  java
  • Okhttp封装、网络层扩展

    一、概述

    首先在这里本片文章是以网络通信封装为主,而app开发首先重要就是网络通信,而如今主流的async、volley、okhttp等,阿么这么网络库怎样能做到更好封装、更好的切换,从而不影响业务层的代码,而本文就是基于这个思路,从而封装了okhttp,并能支持封装切换到async、或者volley,后期会支持这两个库的全部特性。并在调用时候无影响。当前版本号2.6。github地址:

    https://github.com/apple317/HttpClientUtils 

    眼下支持

    • 一般的get请求  支持
    • 一般的post请求 支持文本、表单、表单文件、单个文件操作 支持
    • 基于Http Post的文件上传(类似表单) 支持
    • 文件上传进度  支持
    • 下载文件进度 支持
    • 支持url关闭网络请求 支持
    • 支持session的保持 支持
    • 支持取消某个请求 支持
    • 支持数据异步刷新操作 
    • 支持取消tag请求、支持url取消请求  支持
    • 支持HEAD  支持
    • 支持自签名站点https的訪问,提供方法设置下证书即可 不支持
    • DELETE、PATCH、PUT 支持
    • 增加网络配置、请求过程抽离 支持
    • 增加gson解析。建议增加插件gsonformat来生成解析对象,传入解析类方法setParse
    • 增加url表识来区分请求  支持

    二、引用注意

    • Android Studio

      使用前,对于Android Studio的用户,能够选择加入:

      compile project(':HttpClientUtils')

    三、使用说明

    初始化配置

     HttpConfiguration.Builder configuration=new HttpConfiguration.Builder(getApplicationContext());
            configuration.connectTimeout(2000);
            configuration.retryOnConnectionFailure(true);
            configuration.readTimeout(2000);
            configuration.writeTimeout(2000);
            configuration.diskCacheSize(1000 * 1024);
            configuration.diskCacheDir(getCacheDir());
            BaseHttpClient.getBaseClient().init(configuration.build());
    里面设置超时、读写时间、缓冲路径等

    Get传入方法

     /**
         * 普通參数请求方式
         * url 传入网络地址
         * put传入值
         * tag设置tag
         */
        public void getParam(View view) {
            BaseHttpClient.getBaseClient().newBuilder()
                    .url("http://api.dianping.com/v1/metadata/get_cities_with_deals")
                    .put("appkey", "56065429")
                    .setParse(UserBean.class)
                    .put("sign", "AF24BF8A3F31D22D25422BCDD86AA322F43B5BAB")
                    .setTag("deals").build().execute(new HttpCallback() {
                @Override
                public void onSuccess(String content, BaseHttpClient object, Object parse) {
                    //刷新ui操作
                }
    
                @Override
                public void onError(Throwable error, BaseHttpClient client) {
    
                }
            });
        }

    post文本上传 

    在demo中PostActivity中的postStringData方法:

     /**
         * post上传字符串
         * addUrl传入url地址
         * put传入參数能够
         * apple_txt 这个是专门用来传入文本上传的,请注意
         */
        public void postStringData(View view) {
            /**
             * 第一种写法
             */
            BaseHttpClient.getBaseClient().newBuilder().url("url")
                    .content("你好好好").method(METHOD.POST_STRING)
                    .build().execute(new HttpCallback() {
                @Override
                public void onSuccess(String content, BaseHttpClient object, Object parse) {
                    //刷新ui
                }
    
                @Override
                public void onError(Throwable error, BaseHttpClient client) {
    
                }
            });
        }
    

    post普通表单提交

    在demo中PostActivity中的postData方法:
    /**
         * 普通post请求数据
         * 默认以表单提交
         * addUrl传入url地址
         * put传入參数能够
         *setTag 设置tag
         */
        public void postData(View view) {
            /**
             * 第一种写法
             */
            BaseHttpClient.getBaseClient().newBuilder()
                    .url("url")
                    .put("device_id", "1236716")
                    .setTag("postactivity").put("os", "2")
                    .put("version", "2.1.0").
                    put("mobile", "13621937708").method(METHOD.POST_FORM)
                    .build().execute(new HttpCallback() {
                @Override
                public void onSuccess(String content, BaseHttpClient object, Object parse) {
                    //刷新UI
                }
                @Override
                public void onError(Throwable error, BaseHttpClient client) {
    
                }
            });
        }



    
    

    Post表单文件上传

    在demo中PostActivity中的postFormFile方法:

    /**
         * post
         * 表单文件上传
         * 默认以表单提交
         * addUrl传入url地址
         * put传入參数能够
         *setTag 设置tag
         * put 传入logo为文件上传定义接口名称 value:为文件对象
         * setBaseParams 通过这种传入參数对象
         * 上传文件onProgress 会返回当前网络上传的进度
         * POST_FORM 是普通表单提交
         */
        public void postFormFile(View view) {
            try {
                File file=new File("path");
                ArrayList<File> arrayList=new ArrayList<File>();
                arrayList.add(file);
    //            File file = new File(Environment.getExternalStorageDirectory()
    //                    , "4cc75752fa532553bf7b6f7e00f26db8.png");
                BaseHttpClient.getBaseClient().newBuilder()
                        .url("url")
                        .put("game", "lol")
                        .put("logo", arrayList)
                        .put("token","ee595bd5078a6e67a110c6bd8828c8e2a2388c12")
                        .put("version", "2.1.0")
                        .put("device_id","867905026687709")
                        .put("os","2")
                        .method(METHOD.POST_FORM_FILE).build()
                        .execute(new HttpCallback() {
                            @Override
                            public void onSuccess(String content, BaseHttpClient object, Object parse) {
                                   //刷新ui
                            }
    
                            @Override
                            public void onError(Throwable error, BaseHttpClient client) {
    
                            }
                        });
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    文件上传进度

    在demo中PostActivity中postFormFileProgress方法:
     /**
         * post
         * 表单文件上传
         * 默认以表单提交
         * addUrl传入url地址
         * put传入參数能够
         *setTag 设置tag
         * put 传入logo为文件上传定义接口名称 value:为文件对象 也能够为文件数组对象
         * setBaseParams 通过这种传入參数对象
         * 类型一定要传入POST_FORM_PROGRESS
         * 上传文件onProgress 会返回当前网络上传的进度
         */
        public void postFormFileProgress(View view) {
            try {
                File file = new File(Environment.getExternalStorageDirectory()
                        , "4cc75752fa532553bf7b6f7e00f26db8.png");
                BaseHttpClient.getBaseClient().newBuilder().url("url")
                        .put("game", "lol")
                        .put("logo", file)
                        .put("token","ee595bd5078a6e67a110c6bd8828c8e2a2388c12")
                        .put("version", "2.1.0")
                        .put("device_id","867905026687709")
                        .put("os","2")
                        .method(METHOD.POST_FORM_PROGRESS).build()
                        .execute(new UploadCallback() {
                            @Override
                            public void onSuccess(String content, BaseHttpClient object, Object parse) {
    
                            }
    
                            @Override
                            public void onError(Throwable error, BaseHttpClient client) {
    
                            }
    
                            @Override
                            public void uploadProgress(long bytesRead, long contentLength, boolean done) {
                                mProgressBar.setProgress((int) (100 * (float)bytesRead * 1.0f / contentLength));
                            }
                        });
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    文件下载进度

    在demo中DownFileActivity中的downData方法:

    /**
         * addUrl 加入url地址
         * put传入參数能够
         *setTag 设置tag
         * downName 下载文件命名
         * downDir 下载文件文件夹 假设不传会默认生成一个getCacheDirectory
         * DownEntity 下载返回数据实体:
         * public String name;//名称
         public String path;//保存地址
         public String url;
         public int httpCode;//http网络状态
         //下载是否完毕
         public boolean statue;//下载是否完毕
         public long currentByte;//下载当前字节数
         public long totalByte;//下载总字节数
         public boolean isExecuted;//下载是否运行
         public String dir;//下载文件夹
    
         public boolean isCanceled;//下载是否取消
         public String message;//下载返回消息
         * @param view
         */
        public void downData(View view){
            /**
             * 第一种写法
             */
            BaseHttpClient.getBaseClient().newBuilder().url("http://112.65.235.160/vlive.qqvideo.tc.qq.com/m0019469p4a.mp4?

    vkey=4C7F305D62ABA38AF8BF474C40A0DF9700C8F07BF29BE26D76F17F8A7E73B9FEB1424CC479C4C863BFBDD095AA5EBE49A0CDE3EAEB32E2AD0C009E7C5B37521C0912AF6905C70C601471E664777B9C38C726B03E8D193D62&br=34&platform=2&fmt=msd&sdtfrom=v3010&type=mp4&locid=89489e75-bb18-40e4-989b-89d6b34adf32&size=56306437&ocid=1362567084") .downName("apple_nba").method(METHOD.DOWNLOAD_FILE).build().execute(new DownCallback() { @Override public void downProgress(DownEntity entity) { Log.i("HU", "======bytes===" + entity.currentByte + "==contenLength==" + entity.totalByte); id_progress.setProgress((int) (100 * (float) entity.currentByte * 1.0f / entity.totalByte)); txt_content.setText("当前下载的文件文件夹是"+entity.path+"文件名:"+entity.name+"网络返回code"+entity.httpCode+"===服务端返回消息=="+entity.message); } }); }




    取消单个网络请求

    1.第一种方式通过url要关闭

    BaseHttpClient.getBaseClient().cancelTag("url");

    2.另外一种方式通过传入tag来关闭

    BaseHttpClient.getBaseClient()
            .setTag("deals")

    mParams.setTag("tag");

    取消tag网络请求

    比方,在请求中传入tag对象,销魂时候能够统一销毁同一tag对象訪问
    @Override
    protected void onDestroy()
    {
        super.onDestroy();
         //能够取消同一个tag的
         BaseHttpClient.getBaseClient(getApplicationContext()).cancelTag("tag对象");
    }

    HEAD请求传入

     ConcurrentHashMap<String, String> headMap=new ConcurrentHashMap<String, String>();
            headMap.put("device","1231231241");
            BaseHttpClient.getBaseClient().newBuilder()
                    .url("http://api.dianping.com/v1/metadata/get_cities_with_deals")
                    .put("appkey", "56065429")
                    .setParse(UserBean.class)
                    .setHeadMap(headMap)
                    .put("sign", "AF24BF8A3F31D22D25422BCDD86AA322F43B5BAB")
                    .setTag("deals").build().execute(new HttpCallback() {
                @Override
                public void onSuccess(String content, BaseHttpClient object, Object parse) {
                    UserBean userBean=(UserBean)parse;
                    txt_content.setText(userBean.getCities().get(0) + "type===" );
                }
    
                @Override
                public void onError(Throwable error, BaseHttpClient client) {
    
                }
            });
  • 相关阅读:
    h264 file analyse
    Vision sdk memconfig
    C/C++程序使用lu对象作为配置文件
    函数模板
    socket编程中的read、write与recv、send的区别
    Java锁与公平锁浅析
    模板方法
    开发Java Web程序
    算法小记:暴力字符串查找
    C函数 mktemp
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7353644.html
Copyright © 2011-2022 走看看