专栏首页写代码和思考Android 开发 - 基于okhttp框架封装的开发框架oknet

Android 开发 - 基于okhttp框架封装的开发框架oknet

概述

在android开发中经常要访问网络,目前最流行的网络访问框架就是Okhttp了,然而我们在具体使用时,往往仍然需要二次封装。我使用Builder设计模式进行了封装形成oknet开源库。

介绍

oknet是一套基于okhttp的android网络http框架,封装了请求参数处理,日志打印。

名称:oknet
github地址:https://github.com/vir56k/oknet
作者: zhangyunfeiVir

特性

1.简洁的语法 2.支持自定义处理 message code 不等于0 的情形 3.支持文件上传 4.完整清晰的log日志输出 5.支持 公共参数 的配置 6.支持每个http请求的 日志 记录 7.支持 默认异常 的处理 8.支持 移除文件下载(通过FileDownloader)

适用场景

和服务端产生约定消息结构:

返回的响应的json格式一定为:

{code:0,   msg:"", body:""}
参数说明:
1.服务端 响应成功 则返回对应的json
2.code=0表示成功,body里如正确响应json.
3.code非零表示失败,msg表示失败的文本。
4.body 节点里放置你的自定义json数据

引用

在你的项目的根目录下的 build.gradle 文件中添加引用

compile 'zhangyf.vir56k:oknet:0.0.1'

示例:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'zhangyf.vir56k:oknet:0.0.1'
}

在系统启动时进行一些配置

比如在你的继承自Application的子类中,或者主Activity启动时配置。

    //配置okhttp 缓存位置
    OknetConfig.setExternalCacheDir(getExternalCacheDir());
    //OknetConfig.setRequestParaInterceptor(new CustomRequestParaInterceptor1());
    OknetConfig.setRequestParaInterceptor(new CustomRequestParaInterceptor_jlb_app());
    OknetConfig.setDefaultExceptionHandler(new CustomDefalutExceptionHandler());
    OknetConfig.setLogInterceptor(new LogInterceptor() {
        @Override
        public void onLog(String tag, String msg) {
        //Log.i("日志拦截器拦截到 tag =" + tag, " msg = " + msg);
        }
    });

post简单请求,和String类型的响应

RequestBuilder.with(getActivity()).URL(Apis.GAEA_URLS.CAB_ADVERT_LIST).
            onSuccess(new CommonCallback<String>(String.class) {
                @Override
                public void onSuccess(String result, CommonMessage responseMessage, String responseString) {
                    Log.i(TAG, "==成功:" + result);
                    alert("==成功");
                }
            }).excute();

带参数的请求,和 Json序列化的回调

Type t = new TypeToken<List<Demo2Cell>>() {
}.getType();
RequestBuilder.with(getActivity())
        .URL(Apis.Cab_Urls.GET_BOX_FREE_NEWS)
        .para("cabinet_code", "1412345678")
        .onSuccess(new CommonCallback<List<Demo2Cell>>(t) {
            @Override
            public void onSuccess(List<Demo2Cell> result, CommonMessage responseMessage, String responseString) {
                Log.i(TAG, "!!! 成功:" + result.get(0));
                alert("!!成功" + result.get(0));
            }
        })
        .excute();

自定义处理异常代码(服务返回的消息里的 message code 不等于0) 的情形

   RequestBuilder.with(getActivity())
            .URL(Apis.GAEA_URLS.CAB_ADVERT_LIST)
            .onSuccess(new CommonCallback<String>(String.class) {
                @Override
                public void onSuccess(String result, CommonMessage responseMessage, String responseString) {
                    Log.i(TAG, "==成功:" + result);
                    alert("==成功");
                }
                @Override
                public boolean onFailure(int httpCode, Exception ex, CommonMessage responseMessage, String responseString) {
                    if (ex instanceof NoZeroException) {
                        NoZeroException noZeroException = (NoZeroException) ex;
                        int code = noZeroException.getCode();
                        Log.i(TAG, "!!!!!!!!失败:" + noZeroException);
                        alert("!!!!!!!!!!!!!!!!失败," + noZeroException);
                        //return false;//如果不需要 默认异常处理器再次处理,这里可以返回true
                    }
                    return super.onFailure(httpCode, ex, responseMessage, responseString);
                }
            })
            .excute();

上传文件

File f = new File(Environment.getExternalStorageDirectory().getPath(), "ImageCache/CloseIcon.png");
    if (!f.exists())
        throw new RuntimeException("not found ImageCache/CloseIcon.png");
    RequestBuilder.with(getActivity())
            .URL("http://10.0.1.232:8888/uc/suser/upload_avatar")
            .para("uid", "100202")
            .para("sid", "50e2904ca493d5d25475e4e080858925")
                    /************************ 威力仅仅在这一行,其他都一样 ***************************/
            .file("file", f)
                    /************************ 威力仅仅在这一行,其他都一样 ***************************/
            .onSuccess(new CommonCallback<Demo3Bean>(Demo3Bean.class) {
                @Override
                public void onSuccess(Demo3Bean result, CommonMessage responseMessage, String responseString) {
                    Log.i(TAG, "!!! 成功:" + result.count);
                    alert("!!成功" + result.count);
                }
            })
            .excute();

处理需要显示进度条的情形

RequestBuilder.with(getActivity())
            .URL(Apis.GAEA_URLS.CAB_NOTICE_LIST)
            .para("cabinet_code", "1412345678")
                    /******** 没错,你没有看错,仅仅 下面 一行,进度条就闪亮登场 ************/
            .progress(new DialogProgressIndicator(getActivity()))
                    /******** 没错,你没有看错,仅仅 上面 一行,进度条就闪亮登场 ************/
            .onSuccess(new CommonCallback<Demo3Bean>(Demo3Bean.class) {
                @Override
                public void onSuccess(Demo3Bean result, CommonMessage responseMessage, String responseString) {
                    Log.i(TAG, "!!! 成功:" + result.count);
                    alert("!!成功" + result.count);
                }
            })
            .excute();

这里的 DialogProgressIndicator类 是一个“进度条指示器”对象。

同步的方式发送http请求

private void demo_syncExcuete() {

    new AsyncTask<Void, Void, Void>() {
        boolean isok;
        String mResult1;

        @Override
        protected Void doInBackground(Void... params) {
            RequestBuilder.with(getActivity())
                    .URL(Apis.GAEA_URLS.CAB_ADVERT_LIST)
                    .para("cabinet_code", "1412345678")
                    .onSuccess(new CommonCallback<String>(String.class) {
                        @Override
                        public void onSuccess(String result, CommonMessage responseMessage, String responseString) {
                            isok = true;
                            mResult1 = result;
                        }

                        @Override
                        public boolean onFailure(int httpCode, Exception exception, CommonMessage responseMessage, String allResponseString) {
                            isok = false;
                            return super.onFailure(httpCode, exception, responseMessage, allResponseString);
                        }
                    })
                    .syncExcute();

            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            if (isok) {
                Log.i(TAG, "==成功:" + mResult1);
                alert("==成功");
            }
        }
    }.execute();

}

下载文件

public static void downloadFileDemo() {
    String url = "http://d.hiphotos.baidu.com/zhidao/pic/item/08f790529822720e67a9065978cb0a46f21fab2a.jpg";
    File dest = new File(Environment.getExternalStorageDirectory(), "6f21fab2a.jpg");
    FileDownloader.downloadFile(url, dest, new FileDownloader.DownloadFileProgressListener2() {
        @Override
        public void onFailure(Call call, IOException e) {
            System.out.println("Err: " + e.getMessage());
        }

        @Override
        public void onProgress(long bytesRead, long contentLength, boolean done) {
            System.out.println(String.format("文件下载进度, read %s/%s", bytesRead, contentLength));
        }

        @Override
        protected void onSuccess(Call call, File file) {
            System.out.println("文件下载成功吗 =" + file.exists());

        }
    });
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker 中创建 mysql 容器,并设置远程连接

    -p 代表端口映射,格式为 宿主机映射端口:容器运行端口 -e 代表添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登陆密码

    zhangyunfeiVir
  • NodeJS 使用 koa-static-server 实现静态文件服务

    在NodeJS web service 中,有时候我们需要将一些 静态文件 放到一个文件夹,允许任意访问,比如 css,js html 等文件,或者是允许用户下...

    zhangyunfeiVir
  • Android开发 - 汉字转拼音首字母

    工作中经常会遇到的一些排序问题,比如 按汉字的拼音首字母排序,比如人名排序等,就要用到下面的方法了,思路:

    zhangyunfeiVir
  • Android:Content Provider数据共享

    ContentProvider 属于Android应用程序的组件之一,作用是对外共享数据。我们可以通过ContentProvider把应用中的数据共享给其他应用...

    提莫队长
  • Python写一个像QQ可快捷键唤起区域截屏的应用

    1).首先要能响应快捷键调起截屏程序,像QQ使用Ctrl+shift+B可以截屏一样;

    一墨编程学习
  • 深度 | 详解苹果Core ML:如何为iOS创建机器学习应用?

    选自developer.apple 机器之心编译 参与:吴攀 在昨天开幕的 WWDC 2017 开发者大会上,苹果宣布了一系列新的面向开发者的机器学习 API...

    机器之心
  • 0465-如何使用SQuirreL访问Kerberos环境下的Hive

    在前面Fayson的文章《0459-如何使用SQuirreL通过JDBC连接CDH的Hive(方式一)》和《0463-如何使用SQuirreL通过JDBC连接C...

    Fayson
  • 读取远程文件影响网站打开解决

    有两种办法: 第一使用:设置超时时间 ini_set("max_execution_time", 2); $url = "http://www.0377joyo...

    苦咖啡
  • iOS原生地图开发指南再续——地图覆盖物的应用

    在前两篇博客中,将iOS系统的地图框架MapKit中地图的设置与应用以及关于添加大头针和自定义大头针的相关操作做了详细的介绍。链接如下:http://my.os...

    珲少
  • Hacking with iOS: SwiftUI Edition - Core Data 项目——挑战

    最初,Core Data 似乎是一个枯燥的话题,但是在构建应用程序时它非常有用——您已经了解了如何使用相对简单的代码来添加,删除,排序,过滤等等。是的,在Swi...

    韦弦zhy

扫码关注云+社区

领取腾讯云代金券