[Android开源框架]RxHttp使用说明
RxHttp
对RxJava2+Retrofit2+OkHttp3的封装,优雅实现接口请求和文件下载
功能简介
- 网络请求(RxRequest)
- 监听请求声明周期,如开始结束和网络错误等
- 支持多BaseUrl,可针对不同请求重定向
- 支持无网强制获取缓存数据
- 支持添加公共请求参数
- 支持自定义异常处理和异常提示消息
- 文件下载(RxDownload)
- 支持断点续传
- 支持下载进度回调
- 支持下载速度回调
集成方式
-
在Project的build.gradle添加仓库地址
allprojects { repositories { ... maven { url 'https://www.jitpack.io' } } }
-
在Model:app的build.gradle添加框架依赖
最新版本是多少,看下Releases
dependencies { api 'com.github.goweii:RxHttp:最新版本号' }
RxRequest
使用方法
初始化
初始化操作可在Application中也可在应用启动页中进行
RxHttp.init(this);
RxHttp.initRequest(new DefaultRequestSetting() {
@Override
public String getBaseUrl() {
return Config.BASE_URL;
}
@Override
public int getSuccessCode() {
return 200;
}
});
定义响应体结构
定义ResponseBean<E>继承BaseResponse<E>,定义成员变量并实现方法。
public class ResponseBean<E> implements BaseResponse<E> {
@SerializedName(value = "code", alternate = {"status"})
private int code;
@SerializedName(value = "data", alternate = {"result"})
private E data;
@SerializedName(value = "msg", alternate = {"message"})
private String msg;
@Override
public int getCode() {
return code;
}
@Override
public void setCode(int code) {
this.code = code;
}
@Override
public E getData() {
return data;
}
@Override
public void setData(E data) {
this.data = data;
}
@Override
public String getMsg() {
return msg;
}
@Override
public void setMsg(String msg) {
this.msg = msg;
}
}
定义接口数据结构
public class TimeBean extends BaseBean {
private String time;
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
}
定义Api接口类
- 新建子类继承自Api
- 定义一个内部类Service声明请求(即Retrifit的CategoryService)
- 定义静态无参方法返回Api.api(Service.class)创建Api实例
public class FreeApi extends Api {
public static Service api() {
return Api.api(Service.class);
}
public interface Service {
@GET("public/time")
Observable<ResponseBean<TimeBean>> getTime();
}
}
发起请求
你可以在Activity或者Fragment中发起请求,也可以在你的Presenter层中发起请求,只需要注意请求生命周期的管理。
使用时分为3步处理:
- 在onCreate方法中(如果是Presenter中使用应该在其绑定到视图时)调用RxLife.create()方法,该方法会返回一个RxLife实例mRxLife。
- 在onDestroy方法中(如果是Presenter中使用应该在其从视图解除绑定时)调用mRxLife.destroy()方法,该方法会自动中断所有未完成的请求,防止内存泄漏。
- 调用RxHttp.request(Observable)或者RxRequest.create(Observable)方法发起一个请求,会返回一个Disposable对象,调用mRxLife.add(Disposable)添加至管理队列。
private RxLife mRxLife;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_request);
mRxLife = RxLife.create();
}
@Override
protected void onDestroy() {
super.onDestroy();
mRxLife.destroy();
}
private void getTime() {
mRxLife.add(RxHttp.request(FreeApi.api().getTime()).listener(new RxRequest.RequestListener() {
private long timeStart = 0;
@Override
public void onDownloading() {
log(null);
log("onDownloading()");
timeStart = System.currentTimeMillis();
}
@Override
public void onError(ExceptionHandle handle) {
log("onError(" + handle.getMsg() + ")");
}
@Override
public void onStopped() {
long cast = System.currentTimeMillis() - timeStart;
log("onStopped(cast=" + cast + ")");
}
}).request(new RxRequest.ResultCallback<TimeBean>() {
@Override
public void onSuccess(int code, TimeBean data) {
log("onSuccess(code=" + code + ",data=" + data.toFormatJson() + ")");
}
@Override
public void onFailed(int code, String msg) {
log("onFailed(code=" + code + ",msg=" + msg + ")");
}
}));
}
常用类说明
RxHttp
用于初始化和设置
RequestSetting/DefaultRequestSetting
RxRequest的设置
-
String getBaseUrl()
-
默认的BaseUrl
-
Map<String, String> getMultiBaseUrl()
其他用于重定向的BaseUrl,Map的Key值为添加重定向Header的Value值,Map的Value值为BaseUrl
-
int getSuccessCode()
请求成功后服务器返回的成功Code值
-
int[] getMultiSuccessCode()
请求成功后服务器返回的其他成功Code值
-
long getTimeout()
超时时间
-
String getCacheDirName()
缓存文件夹名
-
long getCacheSize()
缓存大小
-
Map<String, String> getStaticPublicQueryParameter()
拼接在url后面的公共请求参数,静态字符串,如版本号等
-
Map<String, ParameterGetter> getDynamicPublicQueryParameter()
拼接在url后面的公共请求参数,需要动态获取的,如用户名等
-
< E extends ExceptionHandle> E getExceptionHandle()
获取自定义异常处理器
-
Interceptor[] getInterceptors()
添加自定义拦截器
-
Interceptor[] getNetworkInterceptors()
添加自定义拦截器
ExceptionHandle
处理请求过程中的异常,可通过继承自定义。
-
onGetCode(Throwable)
重写该方法去返回异常对应的错误码
-
onGetMsg(int)
重写该方法去返回错误码对应的错误信息
Api
-
Header内部类
-
BASE_URL_REDIRECT
用于BaseUrl的重定向
-
CACHE_ALIVE_SECOND
指定一个int值用于设置缓存有效时长(秒)。配置后,在无网时强制使用缓存数据,有网时,如果小于等于0则强制联网获取,大于0则在改时间间隔内使用缓存,过期后联网获取。
-
-
api(Class< T>)静态方法
创建Api接口实例
RxRequest
用于发起请求
-
create(Observable< R>)
创建实例,传入参数为一个可观察对象,应该为Api接口返回
-
listener(RequestListener)
监听请求的生命周期
-
onDownloading()
请求开始
-
onError(ExceptionHandle)
请求出错,请见ExceptionHandle
-
onStopped()
请求结束
-
-
request(ResultCallback< E>)
请求成功
-
onSuccess(int, E)
服务器返回成功code
-
onFailed(int, String)
服务器返回失败code
-
JsonFieldUtils
创建Json结构的数据
ParameterUtils
构建Map<String, RequestBody>
RxDownload
使用方法
初始化
初始化操作可在Application中也可在应用启动页中进行
RxHttp.init(this);
RxHttp.initDownload(new DefaultDownloadSetting() {
@Override
public long getTimeout() {
return 60000;
}
});
调用
RxDownload mRxDownload = RxDownload.create(et_url.getText().toString())
.setDownloadListener(new RxDownload.DownloadListener() {
@Override
public void onStarting() {
tv_start.setText("正在开始...");
}
@Override
public void onDownloading() {
tv_start.setText("正在下载");
}
@Override
public void onError(Throwable e) {
tv_start.setText("下载失败");
}
@Override
public void onStopped() {
tv_start.setText("已停止");
}
@Override
public void onCanceled() {
tv_start.setText("已取消");
pb_1.setProgress(0);
}
@Override
public void onCompletion(DownloadInfo info) {
tv_start.setText("下载成功");
}
})
.setProgressListener(new RxDownload.ProgressListener() {
@Override
public void onProgress(float progress) {
pb_1.setProgress((int) (progress * 100));
}
})
.setSpeedListener(new RxDownload.SpeedListener() {
@Override
public void onSpeedChange(float bytePerSecond, String speedFormat) {
tv_start.setText("正在下载(" + speedFormat + ")");
}
});
tv_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mRxDownload.start();
}
});
tv_stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mRxDownload.stop();
}
});
tv_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mRxDownload.cancel();
}
});
常用类说明
RxHttp
用于初始化和设置
DownloadSetting/DefaultDownloadSetting
RxDownload的设置
-
String getBaseUrl()
指定默认BaseUrl,传入一个合法的就可以了
-
long getTimeout()
指定超时时间,建议长一点,如60秒
-
String getSaveDirName()
指定默认的下载文件夹路径
DownloadInfo
用于保存下载信息,如需断点续传,需要自己保存以下几个必传项
-
String url
下载文件的链接(必传项)
-
String saveDirName
自定义下载文件的保存目录(断点续传时必传项)
-
String saveFileName
自定义下载文件的保存文件名,需带后缀名(断点续传时必传项)
-
long downloadLength
已下载文件的长度(断点续传时必传项)
-
long contentLength
下载文件的总长度
-
State state
当前下载状态
RxDownload
-
create(String)
用于新建一个下载任务,参数为下载地址
-
create(String, String, String)
用于新建一个下载任务,参数为下载地址、保存目录、保存文件名
-
create(String, String, String,long)
用于新建一个断点续传下载任务,参数为下载地址、保存目录、保存文件名、已下载长度
-
setDownloadListener(DownloadListener)
设置下载状态监听
-
onStarting()
正在开始,正在连接服务器
-
onDownloading()
正在下载
-
onStopped()
已停止,不会删除已下载部分,支持断点续传
-
onCanceled()
已取消,会删除已下载的部分文件,再次开始会重新下载
-
onCompletion(DownloadInfo)
下载完成
-
onError(Throwable)
下载出错
-
-
setProgressListener(ProgressListener)
-
onProgress(float)
下载进度回调(0~1)
-
-
setSpeedListener(SpeedListener)
-
onSpeedChange(float, String)
下载速度回调,两个值分别为每秒下载比特数和格式化后速度(如:1.2KB/s,3.24MB/s)
-
-
start()
开始下载/继续下载
-
stop()
停止下载,不会删除已下载部分,支持断点续传
-
cancel()
取消下载,会删除已下载的部分文件,再次开始会重新下载
UnitFormatUtils
单位格式化工具
-
calculateSpeed(long, float)
计算速度
-
formatSpeedPerSecond(float)
格式化速度(如:1.12MB/s,628KB/s)
-
formatSpeed(float,TimeUnit)
格式化速度(如:1.12MB/s,628KB/s)
-
formatBytesLength(float)
格式化比特值(如:12.1KB,,187.24MB,154GB)
-
formatTimeUnit(TimeUnit)
格式化时间单位(如:秒为s,毫秒为ms)