简介
truck项目的github地址:
https://github.com/hookYuan/Truck
网络操作其中最主要的就是Http操作,而在Android平台大家几乎默认都使用OKHttp,去年特别火的Retrofit+Rxjava+OKHttp的方式也仅仅是在OKHttp的基础上加入了Rxjava做线程切换、使用Rtrofit采用注解的方式来生成参数。为了简化联网操作,和适应公司的联网框架特殊需求,我在truck框架中封装了两种联网方式供大家选择:
- 方案一、Retrofit+Rxjava+OKHttp+Gson
- 方案二、Rxjava+OKHttp+Gson
示例
首先说一下OKHttpUtil的简单用法。OKHttpUtil有两种基本使用方式,第一种单例模式,另一种为普通模式。单例模式的好处在于可以统一配置公共参数,例如为所有请求统一配置请求头token。统一配置如下,建议在Application中初始化。
//配置全局OkHttp联网参数
String sessionid = (String) SPUtil.get(mContext, Config.SESSIONID, "");
OKHttpConfig config = OKHttpConfig.create()
.commonHead(sessionid != null ? sessionid : "")
.commonHeadKey("sessionId")
.connectTimeout(7 * 1000l) //连接超时设置
.readTimeoutMills(7 * 1000l)
.mContext(mContext)
.isReConnection(false).build();
OKHttpUtil.init(config);
如需使用静态OKHttpUtil则需要以上配置,否则不需要。OKHttpUtil封装了Json的智能解析,如需使用,请先配置json的基本格式。默认格式如下:
public class NetBean<T> {
protected T data;
/**
* code : 200
* message : null
* data : eb3968cc-0f64-4b58-9406-a7e51a5bbcad
*/
private int code;
private String message;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
当你的json基本格式也是这样时,可以选择一下请求方式,onSuccess中为data中的数据:
OKHttpUtil.url(BaseUrl.startFrome)
.post("id", id)
.post("processDefinitionId", processDefinitionId)
.execute(new GsonBack<InputFormBean>() {
@Override
public void onSuccess(Call call, InputFormBean obj) {
getV().initInput(obj);
}
});
智能的地方在于GsonBack解析时,只需要传入data的类型泛型即可,onSuccess自动解析data为List、String、obj的各种情况。例如当你的json为:
{
"code":200,
"message":"这是一条消息",
"data":"data是一个字符串"
}
这时你请求可以这样写:
OKHttpUtil.url(BaseUrl.startFrome)
.post("id", id)
.post("processDefinitionId", processDefinitionId)
.execute(new GsonBack<String>() {
@Override
public void onSuccess(Call call, String obj) {
// getV().initInput(obj);
}
});
当你的返回json为一个数组的时候:
{
"code":200,
"message":"这是一条消息",
"data":[
{
"name":"这是一个数组"
}
]
}
你的请求可以这样写:
OKHttpUtil.url(BaseUrl.startFrome)
.post("id", id)
.post("processDefinitionId", processDefinitionId)
.execute(new GsonBack<NameBean>() {
@Override
public void onSuccess(Call call, List<NameBean> obj) {
getV().initInput(obj);
}
});
当你的返回json为一个对象时:
{
"code":200,
"message":"这是一条消息",
"data":{
"name":"这是一个数组"
}
}
请求可以这样写:
OKHttpUtil.url(BaseUrl.startFrome)
.post("id", id)
.post("processDefinitionId", processDefinitionId)
.execute(new GsonBack<NameBean>() {
@Override
public void onSuccess(Call call, NameBean obj) {
getV().initInput(obj);
}
});
这样让你只专注于真实需要解析的数据部分。如果你的接口也是这样的标准返回,这里可以默认根据code的错误码做错误提示。当code码等于失败时,或者onSuccess中的设置数据出现异常时,所有的异常信息都汇集到onFaile方法中,默认是Toast提示,如需特殊处理,重写改方法即可。
下面来说一说请求。OKHttpUtil有几个方法,首先设置url,设置完成后,可以选择post、get、json、bytes、file等多中请求方式。如果上传文件,则可以这样简单:
OKHttpUtil.url(BaseUrl.faceRecogUpload)
.file("image", file).execute(new BaseJsonBack<NetBean>() {
@Override
public void onSuccess(Call call, NetBean obj) {
ToastUtil.showShort(mContext, obj.getMessage());
getV().finish();
}
});
同时如果需要在上传文件时添加参数,则只需在file方法调用post方法即可。其他类型请求类似,详情参考truck,由于OKHttp是一个特别轻量级的封装,如有任何可直接查看okhttputil源码,简单易懂。
如果需要下载文件,请求方式正常设置,只需在execute的时候,替换GsonBack即可,例如:
new OKHttp(getV()).url("http://122.143.192.38:8010/userFile/131492350696019991.mp4")
.get()
.execute(new FileBack() {
@Override
public void onDownloadSuccess(final String fileDir) {
ToastUtil.showShort(mContext, "保存路径--" + fileDir);
}
@Override
public void onDownloading(int progress) {
ToastUtil.showShort(mContext, "下载百分比--" + progress);
}
@Override
public void onDownloadFailed(Exception e) {
ToastUtil.showShort(mContext, "失败");
}
});
以上为OKHttpUtil的基本用法,如有疑问,可以给我留言,如有需要,我后续会专为这个OKHttpUtil写一个专题,这里面确实有很多处理OKHttp请求的联网细节。
下面简单介绍一下RetrofitUtil。RetrofitUtil主要的特点是增加默认json打印,增加RetrofitBack对json回调的统一处理。具体使用方式如下:
RetrofitUtil.create(RequestUrl.class, getV())
.upload(description, body)
.compose(getV().bindToLifecycle())
.compose(RxUtil.io_main())
.subscribe(new RetrofitBack<LoginBean>() {
@Override
public void onSuccess(LoginBean loginBean) {
}
@Override
public void onFailure(Throwable e) {
}
});
快速实现
以上为使用OKHttp实现Http请求的两种方式,Retrofit介绍的内容不是很多,因为Retrofit本身就是对OkHttp一个封装的过程,我没有过多的修改的它的设计理念,这里加了几点我再使用中感觉特别不方便的地方。了解了以上的联网方式,是不是就觉得这样的方式已经很快了,这里我再推荐一个小插件,可以快速提高调试接口速度--GsonFormat。它的安装方式和
Android开发truck快速开发框架TitleBar(六)相同。当你按照完成后,找打你根据json写实体bean的类,只需要按住快捷键shift+alt+s,在弹出的界面中粘贴上json代码,然后点击确定,即可自动json生成实体bean了。这样让你更加专注于逻辑判断处理。
最后附上truck快速开发交流qq群:698442320