XSnow
来源:互联网 发布:资本公积 知乎 编辑:程序博客网 时间:2024/04/28 18:05
转自http://blog.csdn.net/xiaoyaoyou1212/article/details/54631764
基于RxJava2+Retrofit2精心打造的Android基础框架,包含网络、上传、下载、缓存、事件总线、权限管理、数据库、图片加载、UI模块,基本都是项目中必用功能,每个模块充分解耦,可自由拓展。
XSnow,X:未知一切,取其通用之意;Snow:雪,取其纯净之意。该框架通用纯净,只依赖公共核心库。
项目地址:https://github.com/xiaoyaoyou1212/XSnow
项目依赖:
compile 'com.vise.xiaoyaoyou:xsnow:2.0.2'
版本说明
代码托管
效果展示
网络
简介:
网络算是项目的灵魂,基本每个项目都离不开网络,而一个简单好用,又支持各种配置的网络访问库就显得尤为重要了。该模块也是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,可继续定制请求的相关特性,也支持返回回调的处理结果。
支持失败重试机制,可配置失败重试次数以及重试时间间隔。
支持根据Tag中途取消请求,也可以取消所有请求。
……
使用示例:
第一步需要在application中进行全局初始化以及添加全局相关配置,具体使用如下:
- 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
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 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
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
后面就是具体调用请求的过程,请求的类型有多种情形,下面就以最常用的几种类型举例说明,具体效果可以查看demo,以下为使用示例:
- GET 不带缓存
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
提供了多种参数的添加方式,具体可查看BaseRequest中提供的API。
- GET 带缓存
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
由于带缓存方式有点不一样,需要告知上层是否是缓存数据,所以需要外部包裹一层CacheResult结构,使用时必须要按照这种方式设置model,还有需要注意的是必须要设置缓存开关为true,如果为false是没法解析CacheResult结构的,这点一定切记。
- GET 返回String
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- GET 返回List
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- GET 返回ApiResult
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
由于ApiResult这个结构没法通用,用的是拓展库方式提供一种解决方案,可替换成各自服务器定义的字段,具体参考netexpand库,这里使用需要通过BASE将自定义的请求方式设置进去,内部会自动去掉外部层级ApiResult,直接返回你所需的数据部分。
- POST 上传表单
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
上传表单时需要通过addForm将键值对一个个添加进去,支持上传中文字符。
- POST 上传json
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
上传JSON格式数据时需要先将数据转换成JSON格式,再通过setJson添加进去。
- POST 后缀带请求参数
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
有些POST请求可能URL后面也带有参数,这样的话需要通过addUrlParam进行设置,与添加到请求body的参数设置方式addParam是不一样的,这点需要注意。
上传下载
简介:
该库提供的上传下载功能比较简洁实用,基本能满足单个线程下的常用相关操作,如果需要多线程和断点续传功能就需要上层实现,也可以依赖如RxDownload库。
功能:
支持单文件和多文件上传。
支持每个文件都有对应的回调进度。
支持传入字节流或者字节数组进行上传。
支持下载进度回调,每秒刷新下载进度。
使用示例:
由于上传下载功能需要用到网络相关,所以也需要像网络那样进行初始化和添加全局配置。下面是上传下载使用示例,具体效果可以查看demo。
- 上传示例:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
由于API请求成功与上传回调没法统一处理,故将请求成功与上传进度回调分离,上传进度通过UCallback告知调用者,上传进度支持拦截器返回,也支持添加文件上传时设置回调。
- 下载示例:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
通过读取返回的DownProgress获取下载进度,下载文件默认保存在该应用的/cache/download目录下。
缓存
简介:
包含内存、磁盘二级缓存以及SharedPreferences缓存,可自由拓展。磁盘缓存支持KEY加密存储,可定制缓存时长。SharedPreferences支持内容安全存储,采用Base64加密解密。
使用示例:
内存存储:
MemoryCache.getInstance().put("authorInfo", mAuthorModel);
内存获取:
MemoryCache.getInstance().get("authorInfo");
磁盘缓存存储:
diskCache.put("authorInfo", mAuthorModel);
磁盘缓存获取:
diskCache.get("authorInfo");
SharedPreferences缓存存储:
spCache.put("authorInfo", mAuthorModel);
SharedPreferences缓存获取:
spCache.get("authorInfo");
事件总线
简介:
采用Rx响应式编程思想建立的RxBus模块,采用注解方式标识事件消耗地,通过遍历查找事件处理方法。支持可插拔,可替换成EventBus库,只需上层采用的同样是注解方式,那么上层是不需要动任何代码的。
使用示例:
发送事件:
BusFactory.getBus().post(new AuthorEvent().setAuthorModel(mAuthorModel));
注册事件:
BusFactory.getBus().register(this);
取消注册:
BusFactory.getBus().unregister(this);
接收事件:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
如果需要定制使用其他Bus如EventBus,那么只需将实现IBus接口的对象在应用初始化时通过BusFactory.setBus(new EventBus())
传进去即可。
数据库
简介:
采用greenDao数据库,其优势就不多说了,网上有解释,其主要优点就是性能高。该模块定制数据库操作接口,有统一的实现类DBManager,上层只需实现getAbstractDao()方法告知底层DaoSession,增删改查操作不需要关心具体细节,调用DBManager中的方法就行。
使用示例:
- 配置:需要通过gradle添加greendao的相关插件配置,还有需要在当前应用module中的android配置下添加如下配置信息,具体可以参考demo的示例
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
初始化:在application中进行如下初始化操作:
DbHelper.getInstance().init(this);
增:
DbHelper.getInstance().author().insert(mAuthorModel);
删:
DbHelper.getInstance().author().delete(mAuthorModel);
改:
DbHelper.getInstance().author().update(mAuthorModel);
查:
DbHelper.getInstance().author().loadAll()
图片加载
简介:
采用Glide库进行图片加载,支持轻量级图片加载,该模块支持可插拔,可根据需求替换成任意图片加载库,如果项目中对于图片处理要求比较高,那么可以替换成Facebook提供的Fresco库。
使用示例:
初始化:在application中进行如下初始化操作:
LoaderFactory.getLoader().init(this);
调用过程:
- 1
- 1
如果需要定制使用其他图片加载框架如Fresco,那么只需将实现ILoader接口的对象在应用初始化时通过LoaderFactory.setLoader(new FrescoLoader())
传进去即可。
权限管理
简介:
由于Android6.0以上系统对于权限管理更严格,安全性也有很大的提高,但是随之带来的就是权限管理的代码编写更麻烦,如在权限被用户拒绝时该怎么提示,或者在用户勾选永远拒绝下该怎么处理。针对此种情况,该模块尽量以最小的调用完成权限的管理,只需要一行代码就搞定权限的申请过程,并返回所有需要的回调结果。
使用示例:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
UI
简介:
包含基础组件、视图状态管理以及万能适配器。适配器可满足所有基于BaseAdapter的适配器组装,使用方便,易拓展;视图状态管理包含空视图、网络异常、其他异常的重试以及视图切换机制。
使用示例:
- XSnow
- Android轻量级框架XSnow
- 打造Android轻量级框架XSnow
- Android XSnow框架详解(RxJava+Retrofit)
- 打造Android轻量级框架XSnow的后继之路
- C#委托详解(delegate)
- Scala入门学习之隐式转换和隐式参数
- JSON与XML的区别比较
- 计算模拟I2C的传输速率
- Non-resolvable parent POM for cn.e3:e3-manager:0.0.1-SNAPSHOT: Could not find artifact cn.e3:e3-pare
- XSnow
- Java8源码-WeakHashMap
- 打印数字图形【数字菱形】
- JSP标签库
- jsp报错:Expecting "jsp:param" standard action with "name" and "value" attributes
- nginx 超时设置
- 购物车系类_前台也面
- Hierarchical Convolutional Features for Visual Tracking(CF2)论文翻译
- 单人邮箱发送