文章目录

    • 前言
    • MVVM?
    • ViewModel?
    • LiveData?
    • 简单的例子
    • 总结

前言

MVP已经火爆的好几年了,自己也写了一些对于MVP的理解
Android常见的MVP模式与封装,感兴趣的可以去看看,哈哈,但是用了几年发现这玩意还是有很大的缺陷,最不爽的就是,写下来就是接口接口接口接口,虽然可以用契约类写在一起,或者直接用模板去生成对应模块的接口以及类,但是也显得麻烦。还要自己去定制一个个模板类。还有就是如果P层持有的VIew没有处理好。也会照成内存的泄露。所以对于这些原因,加上Google推荐使用Android Jetpack来构建项目,MVVM就值得大家去学习一下啦。!!

MVVM?

什么是MVVM?一开始听到这个玩意,也是一脸的迷茫,啥玩意? 去看了一下,就是这个Model-View-ViewModel

M和V,跟MVP中的没啥区别,要我说就是一个意思,对应的就是获取数据的类和界面,activity/fragment等。重点就在于这个ViewModel,这才是我们要正在要学习的东西。

ViewModel?

二话不说,官网的介绍就是最好的学习资料。看下官网对他的描述

总的来说就是为activity或者fragment准备和管理业务逻辑。照我看来就跟MVP中的P差不多,不同之处在于他们怎样把数据传递给View层而已。而P呢,是持有View的接口引用去回调传递数据,而ViewModel则是通过LiveData去传递数据。

还有一些特性,具有生命周期,就是在依附的Activity或者Fragment没要销毁之前数据是不会丢失,
或者屏幕翻转等。

使用ViewModel时一定要注意,不能让其引用Activity或View,否则可能导致内存泄漏

LiveData?

官网介绍
可观察并且具有生命周期感知的一个玩意。什么意思呢?那就看看例子

简单的例子

需求:获取服务器数据并activity打印

M: LoginRepository

class LoginRepository  {  suspend  fun login(userName: String, passWord: String): Response {        return RetrofitClient.service.login(userName, passWord)    }}

VM:LoginViewModel

class LoginViewModel : ViewModel() {    private val repository by lazy { LoginRepository() }    //用LiveData的子类包裹要检测的值    val mLoginUser: MutableLiveData = MutableLiveData()    fun login(userName: String, passWord: String) {          //使用withContext(Dispatchers.IO) 切换线程   val response = withContext(Dispatchers.IO) { repository.login(userName, passWord) }   //这里直接调用 MutableLiveData setValue 方法把更新数据,如果是异步线程可以使用postValuemLoginUser.value = response.data}}

v:LoginActivity

class LoginActivity:AppCompatActivity(){    private var mLoginViewModel: LoginViewModel ? = null    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_login)        mLoginViewModel = ViewModelProvider(this)[LoginViewModel ::class.java]        //实例化ViewModel,并且监听数据的更新        //不需要在 onPause 或 onDestroy 方法中解除对 LiveData 的订阅/观察。此外,一旦观察者重新恢复 Resumed 状态,它将会重新收到 LiveData 的最新数据        mLoginViewModel?.mLoginUser.observe(this@LoginActivity, Observer {         // update ui.        //打印登陆数据         Toast.makeText(this@LoginActivity, it.toString(), Toast.LENGTH_LONG).show()            })     //请求数据     mLoginViewModel?.login("username","123)  }}

这就完成了一个简单mvvm的玩意,总的来说就是配合liveData和ViewModel的特性完成。

总结

至于一些封装可以配合kotlin的协程,还有Retrofit发布的2.6.0版本也支持了协程。
这样配合着ViewModel+LiveData回调数据,更新UI这一块也可以配合Data binding完成,
个人由于不是很感冒这个Data binding,所以就没写了,如果各位感兴趣可以看看这快的东西。

本来打算写一下协程+MVVM+Retrofit的相关网络请求的内容,发现已经有小伙伴写了,就不重复了。

Retrofit+kotlin Coroutines(协程)+mvvm(Jetpack架构组件)实现更简洁的网络请求

协程这一快的理解可以看看这

Kotlin 的协程用力瞥一眼

实战的项目推荐

还有自己最新写的漫画app
ComiMTC漫画开源项目

部分参考
真香!Kotlin+MVVM+LiveData+协程 打造 Wanandroid!

我是觉得这个很好,里面有用到这个viewModelScope,当 ViewModel 被销毁时它会自动取消协程任务和lamba 函数作为方法时的回调,之前还不知道,哈哈。等等…

就到这吧,如果对你有帮助,点个赞咯-v-!!!?

更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. [置顶] 我的Android进阶之旅------>Android(安卓)Service学习之A
  3. 实现 Android(安卓)应用在开机时自启动
  4. 第三部分:Android(安卓)应用程序接口指南---第二节:UI---第二章 输
  5. android中的解析
  6. 解析Android(安卓)Studio创建的第一个Android(安卓)TV项目
  7. Anroid ListView分组和悬浮Header实现
  8. Android传感器-开发指南
  9. Android数据加密DES、3DES、AES

随机推荐

  1. Android利用Get/Post方式异步请求Json数
  2. Android(安卓)实现左右声道播放不同音乐
  3. 面试题及答案
  4. 使用华为手机在Android(安卓)Studio上进
  5. ButterKnife 使用教程
  6. Android(安卓)View框架总结(九)KeyEvent事
  7. android 高仿多米音乐播放器 (有图有码有
  8. Android: SDCard容量计算
  9. Android日期选择器
  10. Android打Apk包发版?你真的准备好了吗?