🦄Design WanAndroid
前言
- 背景
- 之前一直都是使用的Rxjava,响应式编程是真的写起来特别的简洁优雅,而且直观,一个数据流,从发射->中间的数据转换->消费一目了然(当然前提是本身使用恰当),其中各式各样的操作符完美覆盖任何场景。但是使用的多了也免不了会发现一些问题,比如debug的时候简直难受,还有对于当前逻辑没有显式的表明是否为子线程,特别在函数调用链长且在不同类的时候,往往要追溯很久等等此类。当然事物本来也无完美之事,我们能做的便是尽力追求完美的事物。
- 此外便是目前Android也诞生了很多新东西,所以我打算尝试一下,说不定能带来一些新的视角,因为一件新事物的诞生往往是需要解决旧事物的某处不足。
- 实现
- 目前WanAndroid公开的Api均已实现,我需要的是一个完美的App而不是充满着TODO项。
介绍
App内通篇全采用Material Design 3风格,拒绝半完成式Material带来的UI的割裂感。
我见多很多WanAndroid的开源客户端,在UI上都不怎么重视,但是如果要是日常使用的App,没有得体的UI我相信很难有使用的动力,而Material Design无疑是最好的选择
所有Icon取自Material Symbols,统一而规范的设计。
主题色遵循Material3 Color system。
默认主题色采用Material Theme Builder从图片取色而成。
实现Dynamic Colors,开启动态主题色后,App主题色自动跟随系统主题色且适配深色模式,保持一贯的视觉体验(Android 12及以上支持)
所以可交互的UI均带有Ripple效果,明确表示这是个可交互控件,且Ripple颜色支持取自当前Dynamic colors的主题色
实现
使用buildSrc
,实现全局且统一的依赖管理。
严格遵循Android Architecture Components,逻辑分为:
-
界面层(UI Layer)
- APP内实现:视图(Activity/Fragment等) + 数据驱动及处理逻辑的状态容器(ViewModel等)
-
网域层(Domain Layer) 可选项,用于处理复杂逻辑或支持可重用性吗,当你需要从不同数据源获取数据时如需要同时从数据库和接口请求数据时,推荐使用UseCase进行组合。
-
App内实现:组合或复用数据源(UseCase)
- 比如App内的收藏行为,本身这是一个非常公共性的操作,我可以在大部分地方取消或是收藏一篇文章,所以很适合重用,因此单独作为一个
CollectUseCase
无疑是更好的 (该层是可选的,具体还是要视情况而定)
- 比如App内的收藏行为,本身这是一个非常公共性的操作,我可以在大部分地方取消或是收藏一篇文章,所以很适合重用,因此单独作为一个
-
-
数据层(Data Layer)
- App内实现:数据源(Repository)
Retorfit + OkHttp
使用通用的网络请求库,Retrofit
+ OkHttp
,这个没什么好说的,其中需要注意的是对异常的处理,无论是请求异常或是业务异常。
我见过大部分开源WanAndroid都是每个接口请求后自己再判断,先try catch异常,然后在里面判断是否有业务异常,这样也不是不行,但是不够优雅,使用起来我就不能直接拿到数据吗?而且本身这些非业务的异常也不是发起者自身能够完全处理的。所以需要一个全局的网络异常处理。
CallAdapter, Converter
我们知道Retorfit的强大之一无疑在于其的可定制化强。所以也是从这两个入手。
WanAndroid的接口返回统一结构是:
{
"data": ...,
"errorCode": 0,
"errorMsg": ""
}
这次要做的是把data与error拆开来,正是上面说的使用起来我就不能直接拿到数据吗?
先枚举一下网球请求响应的状态,使用sealed class
可以让when表达式穷举且比起enum class更为灵活。
源代码:NetworkResponse
sealed class NetworkResponse<out T: Any> {
/**
* 成功
*/
data class Success<T: Any>(val data: T) : NetworkResponse