基于RxJava+Retrofit精心打造的Android基础框架,包含网络、上传、下载、缓存、事件总线、权限管理、数据库、图片加载、UI模块,基本都是项目中必用功能,每个模块充分解耦,可随意替换。
XSnow,X:未知一切,取其通用之意;Snow:雪,取其纯净之意。该框架通用纯净,只依赖公共核心库。
网络
简介:
网络算是项目的灵魂,基本每个项目都离不开网络,而一个简单好用,又支持各种配置的网络访问库就显得尤为重要了。该模块也是XSnow的核心功能,使用简单,支持定制常用配置,如各种拦截器、缓存策略、请求头等。
如果不进行二次封装,上层项目基于RxJava+Retrofit请求网络时需要每个接口都写一个服务接口,这样非常不便利。如何将响应结果通用处理就成为该模块的重点,项目中采用泛型转换方式,将响应结果ResponseBody通过map操作符转换成需要的T,具体实现参考项目中http包下的func包,如果需要Http响应码,也可以将响应结果包装成Response这样进行转换成T,考虑到项目中很少需要Http响应码来进行判定,一般使用服务器自定义的响应码就可以了,故该模块采用ResponseBody统一接收这种处理方式。
功能:
支持全局配置和单个请求的局部配置,如果局部配置与全局配置冲突,那么局部配置会替换全局配置。
全局配置支持CallAdapter.Factory
、Converter.Factory
、okhttp3.Call.Factory
、SSLSocketFactory
、HostnameVerifier
、ConnectionPool
、主机URL、请求头、请求参数、代理、拦截器、Cookie、OKHttp缓存、连接超时时间、读写超时时间、失败重试次数、失败重试间隔时间的一系列配置。
局部请求配置支持主机URL、请求后缀、请求头、请求参数、拦截器、本地缓存策略、本地缓存时间、本地缓存key、连接超时时间、读写超时时间的一系列配置。
支持OKHttp本身的Http缓存,也支持外部自定义的在线离线缓存,可配置缓存策略,共有五种缓存策略,如优先获取缓存策略,具体实现参考http包下的strategy包。
支持请求与响应统一处理,不需要上层每个模块都定义请求服务接口。
支持泛型T接收处理响应数据,也可根据服务器返回的统一数据模式定制如包含Code、Data、Message的通用Model ApiResult。由于ApiResult的属性不定,无法做到统一处理,所以单独放到netexpand module中,里面包含与其相关的请求处理,可以根据该module定制属于各自服务器的相关功能。
支持异常统一处理,定制了ApiException拦截处理,统一返回异常信息。
支持返回Observable,可继续定制请求的相关特性,也支持返回回调的处理结果。
支持失败重试机制,可配置失败重试次数以及重试时间间隔。
......
使用示例:
第一步需要在application中进行全局初始化以及添加全局相关配置,具体使用如下:
ViseHttp.init(this);
ViseHttp.CONFIG()
.baseUrl("http://10.8.4.39/")
.setCookie(true)
.converterFactory(GsonConverterFactory.create())
.interceptor(new HttpLogInterceptor()
.setLevel(HttpLogInterceptor.Level.BODY));
后面就是具体调用请求的过程,请求的类型有多种情形,下面就以最常用的几种类型举例说明,具体效果可以查看demo,以下为使用示例:
ViseHttp.GET().suffixUrl("getAuthor").request(mContext, new ACallback() {
@Override
public void onSuccess(AuthorModel authorModel) {
}
@Override
public void onFail(int errCode, String errMsg) {
}
});
ViseHttp.GET()
.suffixUrl("getAuthor")
.setLocalCache(true)
.cacheMode(CacheMode.FIRST_CACHE) //配置缓存策略
.request(mContext, new ACallback>() {
@Override
public void onSuccess(CacheResult cacheResult) {
}
@Override
public void onFail(int errCode, String errMsg) {
}
});
ViseHttp.GET().suffixUrl("getString").request(mContext, new ACallback() {
@Override
public void onSuccess(String data) {
}
@Override
public void onFail(int errCode, String errMsg) {
}
});
ViseHttp.GET().suffixUrl("getListAuthor").request(mContext, new ACallback>() {
@Override
public void onSuccess(List authorModel) {
}
@Override
public void onFail(int errCode, String errMsg) {
}
});
ViseHttp.BASE(new ApiGetRequest()).suffixUrl("getApiResultAuthor").request(mContext, new ACallback() {
@Override
public void onSuccess(AuthorModel authorModel) {
}
@Override
public void onFail(int errCode, String errMsg) {
}
});
ViseHttp.BASE(new ApiPostRequest()
.addForm("author_name", getString(R.string.author_name))
.addForm("author_nickname", getString(R.string.author_nickname))
.addForm("author_account", "xiaoyaoyou1212")
.addForm("author_github", "https://github.com/xiaoyaoyou1212")
.addForm("author_csdn", "http://blog.csdn.net/xiaoyaoyou1212")
.addForm("author_websit", "http://www.huwei.tech/")
.addForm("author_introduction", getString(R.string.author_introduction)))
.suffixUrl("postFormAuthor")
.request(mContext, new ACallback() {
@Override
public void onSuccess(String data) {
}
@Override
public void onFail(int errCode, String errMsg) {
}
});
AuthorModel mAuthorModel = new AuthorModel();
mAuthorModel.setAuthor_id(1008);
mAuthorModel.setAuthor_name(getString(R.string.author_name));
mAuthorModel.setAuthor_nickname(getString(R.string.author_nickname));
mAuthorModel.setAuthor_account("xiaoyaoyou1212");
mAuthorModel.setAuthor_github("https://github.com/xiaoyaoyou1212");
mAuthorModel.setAuthor_csdn("http://blog.csdn.net/xiaoyaoyou1212");
mAuthorModel.setAuthor_websit("http://www.huwei.tech/");
mAuthorModel.setAuthor_introduction(getString(R.string.author_introduction));
ViseHttp.BASE(new ApiPostRequest()
.setJson(GSONUtil.gson().toJson(mAuthorModel)))
.suffixUrl("postJsonAuthor")
.request(mContext, new ACallback() {
@Override
public void onSuccess(String data) {
}
@Override
public void onFail(int errCode, String errMsg) {
}
});
AuthorModel mAuthorModel = new AuthorModel();
mAuthorModel.setAuthor_id(1009);
mAuthorModel.setAuthor_name(getString(R.string.author_name));
mAuthorModel.setAuthor_nickname(getString(R.string.author_nickname));
mAuthorModel.setAuthor_account("xiaoyaoyou1212");
mAuthorModel.setAuthor_github("https://github.com/xiaoyaoyou1212");
mAuthorModel.setAuthor_csdn("http://blog.csdn.net/xiaoyaoyou1212");
mAuthorModel.setAuthor_websit("http://www.huwei.tech/");
mAuthorModel.setAuthor_introduction(getString(R.string.author_introduction));
ViseHttp.BASE(new ApiPostRequest()
.addUrlParam("appId", "10001")
.addUrlParam("appType", "Android")
.setJson(GSONUtil.gson().toJson(mAuthorModel)))
.suffixUrl("postUrlAuthor")
.request(mContext, new ACallback() {
@Override
public void onSuccess(String data) {
}
@Override
public void onFail(int errCode, String errMsg) {
}
});
上传下载
简介:
该库提供的上传下载功能比较简洁实用,基本能满足单个线程下的常用相关操作,如果需要多线程和断点续传功能就需要上层实现,也可以依赖如RxDownload库。
功能:
支持单文件和多文件上传。
支持每个文件都有对应的回调进度。
支持传入字节流或者字节数组进行上传。
支持下载进度回调,每秒刷新下载进度。
使用示例:
由于上传下载功能需要用到网络相关,所以也需要像网络那样进行初始化和添加全局配置。下面是上传下载使用示例,具体效果可以查看demo。
ViseHttp.UPLOAD(new UCallback() {
@Override
public void onProgress(long currentLength, long totalLength, float percent) {
}
@Override
public void onFail(int errCode, String errMsg) {
}}).addFile("androidIcon", getUploadFile(mContext, "test.jpg"))
.baseUrl("https://200.200.200.50/")
.suffixUrl("addImageFile")
.request(mContext, new ACallback