博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
真香!Kotlin+MVVM+LiveData+协程 打造 Wanandroid!
阅读量:6073 次
发布时间:2019-06-20

本文共 3294 字,大约阅读时间需要 10 分钟。

关注 秉心说,公众号后台回复 玩安卓 即可获取 Wanandroid 安装包。

是鸿洋鸿大大的安卓开源知识网站,包含最新博文,最新项目,常用工具,公众号文章收录等等功能,同时也开源了所有 API 接口,方便大家打造自己的 Wanandroid 客户端。Github 上关于 Wanandroid 的客户端也层出不穷,Java的,Kotlin 的,Flutter 的,Mvp 的,MVMM 的,各种各样,但是还没看到 Kotlin+MVVM+LiveData+协程 版本的,加上最近正在看 MVVM 和 LiveData,就着手把我之前写的 Mvp 版本的 Wanandroid 改造成 MVVM, 。注意,mater 分支是年久失修的 Mvp 版本,不一定保证可以运行。mvvm-kotlin 分支是最新代码。

关于 MVVM,大家应该也比较熟悉了,上一张 MVVM 经典架构图:

Model-View-ViewModelView 指绿色的 Activity/Fragment,主要负责界面显示,不负责任何业务逻辑和数据处理。Model 指的是 Repository 包含的部分,主要负责数据获取,来组本地数据库或者远程服务器。ViewModel 指的是图中蓝色部分,主要负责业务逻辑和数据处理,本身不持有 View 层引用,通过 LiveDataView 层发送数据。Repository 统一了数据入口,不管来自数据库,还是服务器,统一打包给 ViewModel ,我在项目中并没有使用数据库,而是使用缓存代替。

除了 MMVM 以外,我用 协程 代替了 RxJava。这里先不论协程和 RxJava 孰优孰劣,只是用惯了 RxJava,协程的确会给你耳目一新的感觉,用同步的方式写异步代码。在 Java 中并没有协程的概念,Kotlin 中在编译期实现了协程,通过类似状态机的实现。协程可以看做是轻量级的线程,不会存在上下文切换的带来的性能损耗,理论上是比线程效率更高的。

下面以登录页面 LoginActivity 为例,看一下数据流程。

Model

@POST("/user/login")fun login(@Field("username") userName: String, @Field("password") passWord: String): Deferred
>复制代码

这是登录 Api 接口。

class LoginRepository : BaseRepository() {    suspend fun login(userName: String, passWord: String): WanResponse
{ return apiCall { WanRetrofitClient.service.login(userName, passWord).await() } } }复制代码

LoginRepository 中定义具体的登录逻辑,通过 Retrofit 调用登录接口,返回 WanResponse<User>。注意,要在协程中使用,所以定义为 suspend 方法。

ViewModel

class LoginViewModel : BaseViewModel() {    val mLoginUser: MutableLiveData
= MutableLiveData() val errMsg: MutableLiveData
= MutableLiveData() private val repository by lazy { LoginRepository() } fun login(userName: String, passWord: String) { launch { val response = withContext(Dispatchers.IO) { repository.login(userName, passWord) } executeResponse(response, { mLoginUser.value = response.data }, { errMsg.value = response.errorMsg }) } }}复制代码

LoginViewModel 持有 LoginRepository,并通过它执行具体登录逻辑,这一块使用协程执行。返回结果通过 executeResponse() 方法处理,这是我自己封装的方法:

suspend fun executeResponse(response: WanResponse
, successBlock: suspend CoroutineScope.() -> Unit, errorBlock: suspend CoroutineScope.() -> Unit) { coroutineScope { if (response.errorCode == -1) errorBlock() else successBlock() } }复制代码

Kotlin 的一些函数式编程语言特性会给我们的开发带来一些便利。executeResponse() 提供了统一的响应错误处理。

View

mViewModel.apply {        mLoginUser.observe(this@LoginActivity, Observer {            dismissProgressDialog()            startActivity(MainNormalActivity::class.java)            finish()        })        errMsg.observe(this@LoginActivity, Observer {            dismissProgressDialog()            it?.run { toast(it) }        })    }复制代码

最后就是 LoginActivity 代表的 View 层了,View 层和 ViewModel 层通过 LiveData 进行绑定,上面代码中的 mLoginUsererrMsg 就是 ViewModel 层 “发射” 过来的数据。关于数据绑定,我并没有使用 DataBinding,这个纯粹是个人喜好了,我只是不喜欢 DataBinding 带来的代码不易读。

相对 Mvp 繁多的接口来说,个人感觉 Mvvm 的数据流更加清晰。搭配 Kotlin 和协程的使用,进一步简化代码。下面是一些项目截图:

项目地址点这个: ,记得切换到 mvvm-kotlin 分支 ,欢迎带来 star 和 issue 丢过来 !

推荐一下我的另一个应用,,添加了查看 logcat 的功能。

最后,也欢迎大家关注我的公众号 秉心说,话说公号关注人数还没掘金多,后续会继续 《走进 JDK 系列》以及 Android 相关知识的分享,欢迎大家扫码关注!有任何关于 Java/Android 的问题也可以加我的个人微信 bingxinshuo_

公众号后台回复 玩安卓 即可获取 Wanandroid 安装包。

文章首发微信公众号: 秉心说 , 专注 Java 、 Android 原创知识分享,LeetCode 题解,欢迎关注!

转载地址:http://xjsgx.baihongyu.com/

你可能感兴趣的文章
KVM虚拟化网络优化技术总结
查看>>
2012中国知识管理论坛成功举办,演讲内容公开了
查看>>
mysql互换表中两列数据方法
查看>>
Zabbix Proxy 表空间爆增经验分享
查看>>
企业云桌面-11-准备虚拟机-151-CTXXA01
查看>>
百度轻应用,须防周鸿祎
查看>>
微软私有云分享(R2)17SCAC被精简的功能
查看>>
我是不是在浪费生命?
查看>>
XenApp_XenDesktop_7.6实战篇之十九:安装、升级和配置StoreFront 3.0
查看>>
redis 使用总结
查看>>
老罗的创业故事演讲
查看>>
经验之谈:破解网络竞价菜鸟迷茫困局
查看>>
好书分享:《SEO实战密码》第3版
查看>>
如何编写更好的SQL查询:终极指南-第二部分
查看>>
VMware vCenter Operations Manager安装与基本配置
查看>>
Shell脚本监控WEB服务是否正常
查看>>
了解并下载CentOS的网络渠道
查看>>
理解并配置:IPv6的静态路由与默认路由
查看>>
HTTP协议下客户/服务器模式中信息交换的实现
查看>>
【view桌面虚拟化系列】2-View搭建
查看>>