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());
}
});
}
android 开发 - 使用okhttp框架封装的开发框架的更多相关文章
- 上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二)
上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二) 前几篇博文中给大家介绍了一下APP中的基本业务及开发本项目使用的网络架构: 上门洗车APP --- Androidc ...
- Android开发常用开源框架:图片处理
https://blog.csdn.net/SGQ_CSDN/article/details/79910709 Android开发常用开源框架:图片处理 框架名称 功能描述 Android Unive ...
- Android开发之开源框架OKHTTP的Get请求代码,得到json字符串方法
<span style="white-space:pre"> </span><pre name="code" class=&q ...
- Android开发之使用Handler封装下载图片工具类(源码分享)
假设每下载一张图片,就得重写一次Http协议,多线程的启动和handler的信息传递就显得太麻烦了,我们直接来封装一个工具类,便于我们以后在开发时随时能够调用. (1)在清单文件加入权限 <us ...
- openresty 前端开发轻量级MVC框架封装一(控制器篇)
通过前面几章,我们已经掌握了一些基本的开发知识,但是代码结构比较简单,缺乏统一的标准,模块化,也缺乏统一的异常处理,这一章我们主要来学习如何封装一个轻量级的MVC框架,规范以及简化开发,并且提供类似p ...
- openresty 前端开发轻量级MVC框架封装二(渲染篇)
这一章主要介绍怎么使用模板,进行后端渲染,主要用到了lua-resty-template这个库,直接下载下来,放到lualib里面就行了,推荐第三方库,已经框架都放到lualib目录里面,lua目录放 ...
- Android开发利用Volley框架下载和缓存网络图片
2013年Google I/O大会上推出了一种新的网络通信框架——Volley,Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可 ...
- android开发学习——Mina框架
Apache Mina Server 是一个网络通信应用框架,对socket进行了封装. http://www.cnblogs.com/moonandstar08/p/5475766.html htt ...
- NO.4 Android开发中常用框架及工具
android-pulltorefresh 一个强大的拉动刷新开源项目,支持各种控件下拉刷新ListView.ViewPager.WevView.ExpandableListView.GridView ...
随机推荐
- WP8.1:关于屏幕尺寸和分辨率的那些事儿
目前市面上的Windows Phone设备越来越多,尺寸和分辨率也越来越多,特别是WP8.1时代的到来.做过wp开发的人都知道应用适配其实较安卓要简单太多了,其中有一个重要原因,就是微软号称所有WP设 ...
- Asp.Net Web API 2第二课——CRUD操作
详情请查看http://aehyok.com/Blog/Detail/69.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...
- missing locales
原文地址:http://codewut.de/content/missing-locales-under-debian This drives me crazy! Every time I deboo ...
- JSP的那些事儿(2)---- DWR2.0 的配置和使用
JSP的那些事儿(2)----DWR2.0 的配置和使用 分类: Web开发 JAVA 2009-04-23 15:43 999人阅读 评论(0) 收藏 举报 jspdwrjavascriptserv ...
- 从快的线上callback hell代码说起
概述 就像谈到闭包必须要说js变量作用域一样,谈到 promise 之前肯定要先说谈异步编程.一直以来, javascript 处理异步方式都是使用 callback 方式,对与写 javascrip ...
- java 连接 MySQL
java 连接 MySQL 1.准备工作 需要下载的工具: MySQL:http://www.mysql.com/downloads/ MySQL的可视化工具SQLyog:https://www.we ...
- C语言实现单链表-01版
单链表的应用非常广,它可以实现栈,队列等: Problem 我对学习任何东西都希望能找到尽可能简单的例子,而不是看起来好高大上的: 对链表这样简答的数据结构,有些书也是写得太过“完美”啦: 初学者很难 ...
- MVC 添加 httpHandlers 支持 .aspx 页面访问
<?xml version="1.0"?> <!-- For more information on how to configure your ASP.NET ...
- Web端测试和移动端测试的区别
1.记录bug 在Web端可以通过系统自带的截图和QQ截图等方式来截取bug的图片,对于错误的地方可以用工具自带的标识来重点标记. 对于移动端设备可以用手机自带的截图工具来截图然后传到电脑上,个人一般 ...
- 重学JAVA基础(八):锁的基本知识
1.线程状态 如上图,当我们新建一个线程,并start后,其实不一定会马上执行,因为只有操作系统调度了我们的线程,才能真正进行执行,而操作系统也随时可以运行其他线程,这时线程又回到可运行状态.这个过程 ...