android 开发 - 使用okhttp框架封装的开发框架

概述

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

介绍

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

Github地址

https://github.com/vir56k/oknet

特性

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();

同步的方式发送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());

        }
    });
}
时间: 2024-10-17 18:34:28

android 开发 - 使用okhttp框架封装的开发框架的相关文章

上门洗车APP --- Android客户端开发 之 网络框架封装(二)

上门洗车APP --- Android客户端开发 之 网络框架封装(二) 前几篇博文中给大家介绍了一下APP中的基本业务及开发本项目使用的网络架构: 上门洗车APP --- Android客户端开发 前言及业务简介 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一) 本篇接着给大家分享网络框架封装,相信感兴趣的朋友已经对上篇博文中的一些开源项目有了些许了解,这里继续为大家介绍关于GenericDataManager 通用网络管理类中的 dataRequest 方法 和

上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一)

上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一) 上篇文章中给大家简单介绍了一些业务,上门洗车APP --- Android客户端开发 前言及业务简介,本篇文章给大家介绍下网络框架,之前也了解过一些开源网络通讯架构,也大概看了一部分源码,比如Afinal.Volley.AndBase.Android-async-http等,感觉各自都有各自的优劣,自己也曾封装过一些简单的网络架构,感觉有很多地方需要注意和优化,这里就不贴出来献丑了,感兴趣的朋友可以去查阅学习上面所说的

上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二)

上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二) 前几篇博文中给大家介绍了一下APP中的基本业务及开发本项目使用的网络架构: 上门洗车APP --- Androidclient开发 前言及业务简单介绍 上门洗车APP --- Androidclient开发 之 网络框架封装介绍(一) 本篇接着给大家分享网络框架封装.相信感兴趣的朋友已经对上篇博文中的一些开源项目有了些许了解.这里继续为大家介绍关于GenericDataManager 通用网络管理类中的 data

android开发对volley的封装

大部分的android应用开发都会涉及到网络操作,而在网络操作中绝大部分又是http的操作,你可能会选用java的 HttpUrlConnection.也可能是Apache的HttpClient,想要高度的封装的还有Google的亲儿子Volley,其他的还有诸如OkHttp,Xutils等很多第三方的框架. 而我在开发中更加倾向于使用Google的Volley,毕竟亲儿子嘛,虽然用起来比一些三方的要复杂一点,但是我们完全可以自己封装一下,这篇博客,我们就去高度封装一下volley,让volle

NO.4 Android开发中常用框架及工具

android-pulltorefresh 一个强大的拉动刷新开源项目,支持各种控件下拉刷新ListView.ViewPager.WevView.ExpandableListView.GridView.(Horizontal)ScrollView.Fragment 上下左右拉动刷新,比johannilsson那个只支持ListView的强大的多.并且他实现的下拉刷新ListView在item不足一屏情况下也不会显示刷新提示,体验更好.项目地址:https://github.com/chrisba

Android开发之OkHttp的使用

本篇记录的是Android开发中OkHttp框架的使用.OkHttp是Java中用于网络请求的一个库,主页为:http://square.github.io/okhttp/, github地址为:https://github.com/square/okhttp 下面介绍OkHttp库的用法,本篇会给出OkHttp的使用demo,demo中包含了常用的get请求.post请求.文件的上传和下载,demo运行的效果如下图所示: 下面上代码一一说明: 要使用OkHttp,必须在项目中先导入OkHttp

Android 多线程多任务下载框架的实现(一)

什么是多线程多任务下载框架: Android 多线程多任务下载框架 封装了一个下载工具类,该下载工具支持多线程下载,下载任务队列,下载进度更新,取消下载等.可用于应用市场app的下载,音乐下载等. 为什么需要多线程多任务下载框架: 我们在开发Android 应用市场的时候需要下载apk,这个时候用户希望能同时下载多个apk并且显示正确的进度条信息,且下载速度快,那么我们就需要多线程多任务下载框架来支持这些功能,来达到很好的用户体验. 怎么实现多线程多任务下载框架: 涉及到的知识点: 1.线程操作

android开发入门详细教程

随着移动端开发的火热,越来越多的IT程序员转做移动开发,做J2EE的转做Android开发,现在让麦子学院android开发老师给大家讲讲一些入门经验,希望能给你带来帮助. 工具/原料 .        JDK,ADT,JAVA 方法/步骤 1.   开发工具的准备: 第一个工具:JDK1.7, 第二个工具:Android Developer Tools简称ADT. JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)  只需以上两个工具就可以进行开发

Android开发使用的常见第三方框架汇总

本文转载:http://blog.csdn.net/liuhaomatou/article/details/44857005 1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)  JSON,图像等的异步下载: (2)  网络请求的排序(scheduling) (3)  网络请求的优先级处理 (4)  缓存 (5)  多级别取消请求 (6)  和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)