青训营大作业技术选型介绍( | 青训营笔记

99 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第5天

多模块

整个Android项目工程分为两类:

  1. 一类是可独立运行的模块,如app模块和独立调试的模块,在配置中应用com.android.application插件。

  2. 另一类是不可独立运行的模块,如业务模块(以module_开头)、服务模块(以lib_开头)和桥梁模块(以api_开头),在配置中应用com.android.library插件。

在团队中使用多模块开发可以让队员们各尽其职,各自负责自己开发的模块,而不用影响其他队友代码的正常开发。

Flow

我所理解的Flow是kt中对标RxJava的异步框架,它们可以让线程切换变得简单,通过链式调用将异步代码以看似同步的方式写出来。除此之外Flow相比于RxJava的优势就是其操作符设计比RxJava要简单易用,对新手友好,但缺点是目前Flow有很多api都处于实验中,不够完善。

本项目的榜单列表界面使用**flattenMerge()方法将本地数据流和远程数据流合并,并让它们在被收集时能够并行执行**。而榜单版本列表界面中在获取到远程榜单版本列表数据后则将其直接插入到本地数据库,然后将Flow与Room结合,Dao层查询本地榜单版本列表数据库,并返回一个Flow作为可观察对象,这样当数据库数据发生变化时,其对于的观察者会接收到通知,进而更新界面UI。

除此之外,flow还有mapflowOn等强大且简洁的操作符。我们还可以使用flow {...}高阶函数快速创建一个冷流,除此之外还可以使用StateFlow和SharedFlow创建热流,使得界面在返回时其中存储的数据仍然还在。

OkHttp+Retrofit

我们在项目中为创建的OkHttp单例添加了日志打印拦截器HttpLoggingInterceptor,当项目以DEBUG模式运行时打印请求体Body的内容,以便我们在调试网络请求部分相关代码时可以清晰地查看发送的请求体内容和接收到的响应内容。如下图所示为请求榜单版本数据时打印的调试日志:

对于创建的Retrofit单例,我们为其添加上GsonConverterFactory,可以让其使用Gson自动帮我们把请求响应体转换为具体对象类型。