基于OkHttp的封装库TigerOkHttp的使用

在前面熟悉了OkHttp的用法之后,为了简化用法同时适用于我的项目,我针对OkHttp进行了更进一步的封装(源码及其Demo地址在https://github.com/huyongli/TigerOkHttp)

TigerOKHttp特性

封装之后其支持的功能特性包括如下:

  1. 一般的get同步阻塞请求和异步请求

  2. 一般的post同步阻塞请求和异步请求

  3. 实现了文件上传功能(包含文件上传进度回调显示)

  4. 实现了大文件下载功能,只需要指定文件下载路径即可,也包含了下载进度的回调显示

  5. 实现了请求结果的自动解析,用户也可以根据需求扩展自定义结果解析类

  6. 对所有请求都支持直接将结果解析转换为JavaBean对象或集合

  7. 支持对返回结果结构的自定义,例如设置返回结果结构为:{flag:1|0,error:错误信息,result:请求结果},结果解析的时候会按照此结构进行结果解析

  8. 支持取消某个请求

如果还不知道如何使用OkHttp请参考我的上一篇文章 Android中OkHttp的使用 进行了解。

初始化配置

所有的请求在使用之前,先在Application里执行TigerOkHttp.init(new TigerHttpConfig(getApplicationContext()));进行TigerOkHttp的初始化操作。

TigerHttpConfig中主要是设置请求的全局性配置:

  1. TigerHttpConfig.readTimeOut:设置全局请求的数据读取超时时间,默认为30s

  2. TigerHttpConfig.writeTimeOut:设置全局请求的数据写入超时时间,默认为15s

  3. TigerHttpConfig.connectTimeOut:设置全局请求的连接超时时间,默认为15s

  4. TigerHttpConfig.cacheSize:设置全局请求的缓存大小,默认为10M

  5. TigerHttpConfig.cacheDirectory:设置全局请求的缓存存储路径,默认为系统给应用分配的缓存路径

  6. TigerHttpConfig.isWrapperResult:设置全局请求结果是否对结果进行了封装,默认为true

  7. TigerHttpConfig.wrapperJsonResult:设置全局请求结果的结构类型,在isWrapperResult为true时才起作用

WrapperJson主要自定义设置全局请求结果的结构类型:

  1. WrapperJson.code_name:设置请求成功与否的状态码字段,默认为:flag

  2. WrapperJson.result_name:设置请求成功后结果字段,默认为:result

  3. WrapperJson.error_name:设置请求失败后的错误信息字段(仅在请求失败时才有值),默认为:error

  4. WrapperJson.code_error_value:设置请求失败的状态码值,当请求状态码与此值相等时代表请求失败

Get请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*-------------------- 以下为Get同步阻塞请求 -------------------------------*/
//根据请求URL构造请求对象,请求成功后直接返回结果为Model对象
TigerJsonRequest<Model> request = new TigerJsonRequest<Model>(URL, Model.class);
/*
* 如果要同步请求返回Model集合的话,请求对象这样构造
* TigerJsonRequest<List<Model>> request = new TigerJsonRequest<List<Model>>(URL, Model.class);
*/
//以下添加三个请求参数
request.addParam("value", "同步get请求-返回Model")
.addParam("isModel", true)
.addParam("isList", false);
//同步阻塞请求,直接返回Model对象
Model result = TigerOkHttp.getSync(request);
//同步阻塞请求,直接返回Model集合
//List<Model> result = TigerOkHttp.getSync(request);
/*-------------------- 以下为Get异步请求 ------------------------------*/
//根据请求URL构造请求对象,请求成功直接返回结果为Model集合
TigerJsonRequest<List<Model>> request = new TigerJsonRequest<List<Model>>(URL);
//添加三个请求参数
request.addParam("value", "异步get请求-返回List<Model>")
.addParam("isModel", true)
.addParam("isList", true)
.setRequestCallback(new RequestCallback<List<Model>>() {//设置异步请求回调
@Override
public void onSuccess(List<Model>result) {
showResult(result.toString());
}
@Override
public void onFailure(TigerHttpException e) {
showResult(e.getMessage());
}
});
//开始异步请求
TigerOkHttp.getAsync(request);

上面即为一般Get同步阻塞请求和异步请求的方式,对这两个请求需要说明几点:

  1. 首先根据请求URL构造一个请求对象TigerJsonRequest,如果为同步阻塞请求必须调用具有两个参数的构造函数以设置请求地址和设置请求返回的结果类型,如果是异步请求则只需要调用一个参数的构造函数设置请求地址即可(异步请求的返回结果类型会自动根据泛型判断)

  2. 在请求对象添加此请求相关的请求参数

  3. 如果是异步请求,在请求对象中添加异步请求回调接口RequestCallback

  4. 根据是否为异步请求在TigerOkHttp中选择对应的请求方法开始请求操作

  5. 如果解析后返回Model对象话,服务端返回的结果必须是JSON字符串,如果解析后返回Model集合的话,服务端返回的结果必须是JSON数组字符串

Post请求

这里的Post同步、异步请求和上面的Get的同步异步请求方式基本上一样,构造请求对象TigerJsonRequest的方式是一模一样的,唯一的区别只是在最后发起请求操作上更换了请求方法

  1. post同步阻塞请求的发起方式为:T result = TigerOkHttp.postSync(request);

  2. post异步请求的发起方式为:TigerOkHttp.postAsync(request);

自定义结果解析器

TigerJsonRequest自带的默认解析器TigerJsonParser无法满足你的功能需求时,我们只需要简单的两步即可为某次请求实现自定义解析器:

  1. 继承TigerParser<T>(会自动根据设置的全局结果结构进行解析判断请求是否成功、拿到请求的真正结果数据)这个解析基类然后实现public abstract T parser(BufferedSource source) throws TigerHttpException;方法

  2. 通过TigerJsonRequest类中的方法setDataParser(TigerParser dataParser)设置此次请求的结果解析器

上传文件

上传文件模块我是在TigerJsonRequest基础上扩展出了一个专门针对上传文件的请求对象TigerUploadRequest,具体的上传文件实现方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//根据上传请求地址和文件路径构造文件上传请求对象
TigerUploadRequest<String> request = new TigerUploadRequest<String>(url, filePath);
//设置上传回调监听
request.setRequestCallback(
new RequestCallback<String>() {
@Override
public void onPreExecute() {
super.onPreExecute();
//此处可以初始化显示上传进度UI
}
@Override
public void onSuccess(String result) {
//文件上传成功
}
@Override
public void onLoading(long count, long current) {
super.onLoading(count, current);
//此处可以更新上传进度
}
@Override
public void onFailure(TigerHttpException e) {
//文件上传失败
}
@Override
public void onAfterExecute() {
super.onAfterExecute();
//此处可以隐藏上传进度条
}
});
//发起上传操作
TigerOkHttp.postAsync(request);

下载文件

下载文件功能需要用到另外一个请求对象TigerFileRequest

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//根据下载请求地址和下载文件的保存路径构造请求对象
TigerFileRequest request = new TigerFileRequest(URL, fileSavePath);
//添加一个请求参数
request.addParam("method", "download")
//设置下载过程中的回调接口
.setRequestCallback(new RequestCallback<File>() {
@Override
public void onPreExecute() {
super.onPreExecute();
//此处初始化显示下载进度条UI
}
@Override
public void onSuccess(File result) {
//下载成功,同时返回下载成功的文件
}
@Override
public void onLoading(long count, long current) {
super.onLoading(count, current);
//更新下载进度UI
}
@Override
public void onFailure(TigerHttpException e) {
//下载失败
}
@Override
public void onAfterExecute() {
super.onAfterExecute();
//隐藏下载进度条UI
}
});
//发起下载请求
TigerOkHttp.getAsync(request);

取消某个请求

取消某个请求只需要调用TigerOkHttp.cancel(request.getTag())即可,如果没有手动设置请求对象request的tag值,请求的时候会自动为这次请求生成一个唯一的tag

以上基本上就是TigerOkHttp框架的所有功能的使用方法,欢迎各位下载使用。

由于本人能力有限,此框架可能存在某些不足的地方,如果各位发现问题,欢迎提出,我会尽快解决,另外我会不断丰富完善此框架的功能。

write by laohu

2016-1-6


原创文章,本文采用知识共享署名 2.5(中国大陆许可协议)进行许可,欢迎转载,但转载请注明来自ittiger.cn,并保证转载后文章内容的完整性。本人(laohu)保留所有版权相关权利。



评论