概述

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

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

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

    上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二) 前几篇博文中给大家介绍了一下APP中的基本业务及开发本项目使用的网络架构: 上门洗车APP --- Androidc ...

  2. Android开发常用开源框架:图片处理

    https://blog.csdn.net/SGQ_CSDN/article/details/79910709 Android开发常用开源框架:图片处理 框架名称 功能描述 Android Unive ...

  3. Android开发之开源框架OKHTTP的Get请求代码,得到json字符串方法

      <span style="white-space:pre"> </span><pre name="code" class=&q ...

  4. Android开发之使用Handler封装下载图片工具类(源码分享)

    假设每下载一张图片,就得重写一次Http协议,多线程的启动和handler的信息传递就显得太麻烦了,我们直接来封装一个工具类,便于我们以后在开发时随时能够调用. (1)在清单文件加入权限 <us ...

  5. openresty 前端开发轻量级MVC框架封装一(控制器篇)

    通过前面几章,我们已经掌握了一些基本的开发知识,但是代码结构比较简单,缺乏统一的标准,模块化,也缺乏统一的异常处理,这一章我们主要来学习如何封装一个轻量级的MVC框架,规范以及简化开发,并且提供类似p ...

  6. openresty 前端开发轻量级MVC框架封装二(渲染篇)

    这一章主要介绍怎么使用模板,进行后端渲染,主要用到了lua-resty-template这个库,直接下载下来,放到lualib里面就行了,推荐第三方库,已经框架都放到lualib目录里面,lua目录放 ...

  7. Android开发利用Volley框架下载和缓存网络图片

    2013年Google I/O大会上推出了一种新的网络通信框架——Volley,Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可 ...

  8. android开发学习——Mina框架

    Apache Mina Server 是一个网络通信应用框架,对socket进行了封装. http://www.cnblogs.com/moonandstar08/p/5475766.html htt ...

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

    android-pulltorefresh 一个强大的拉动刷新开源项目,支持各种控件下拉刷新ListView.ViewPager.WevView.ExpandableListView.GridView ...

随机推荐

  1. 39行代码实现JS HTML模板(轻量+高效+易用)

    otmpl 是一个轻量级前端模版(仅有39行无压缩代码,支持缓存),所用指令仅需[#...#]和{#...#},前者包含需要输出html语句,后者包含js变量. 支持javascript完整语法,你可 ...

  2. 基于Qt的流程设计器(一)

    一: 先来看一下界面的截图:   说明: 拖动节点的时候,与该节点相关的箭头连线也会跟着调整: 用户可以使用鼠标从一个节点拖出一个箭头到另一个节点(鼠标在空白区域点击一下,拖出的箭头消失)   这三个 ...

  3. 用命令提示符压缩文件,解压缩文件(不需要客户端安装7zip)

    压缩成一个CAB包的办法: type list.txt (生成一个文件列表) makecab /f list.txt /d compressiontype=mszip /d compressionme ...

  4. onFocus="this.blur()"的解释

    onFocus="this.blur()" onFocus即获取焦点的意思,而blur却是失去焦点的意思,因此onFocus="this.blur()"的通俗理 ...

  5. [C++] C\C++ printf 输出格式

    1.转换说明符      %a(%A)     浮点数.十六进制数字和p-(P-)记数法(C99)      %c         字符      %d         有符号十进制整数      % ...

  6. MySQL的pt-query-digest的下载与使用

    对于脚本文件,是可以执行的,我们不用安装.所以,但是这个脚本文件没有执行的权限,所以,我们首先赋予这个脚本文件的可执行的权限. 再次查看文件的信息后. 已经有了执行的权限了. 运行脚本的时候,可要注意 ...

  7. UItableView嵌套UICollectionView

    首先我们需要继承一下UITableView并且遵守<UITableViewDelegate,UITableViewDataSource,UICollectionViewDataSource,UI ...

  8. spring源码 — 一、IoC容器初始化

    IoC容器初始化 注意:本次的spring源码是基于3.1.1.release版本 容器:具有获取Bean功能--这是最基本功能,也是BeanFactory接口定义的主要行为,在添加了对于资源的支持之 ...

  9. Language

    TODO Java(jdk8),Scala,Spring,Spark,Python,Linux,C,Netty,HttpClient,Hadoop YARN,RaspberryPi Jetty,Tom ...

  10. ArrayList/Vector的原理、线程安全和迭代Fail-Fast

    疑问 * ArrayList是非线程非安全的,具体是指什么?具体会产生什么问题?* ArrayList的内部原理是什么?为什么可以动态扩容?* Vector是线程安全的,具体是如何实现的?为什么不再推 ...