Android 对于MVVM模式的理解

前言

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<User> {
        return RetrofitClient.service.login(userName, passWord)
    }
}

VM:LoginViewModel

class LoginViewModel : ViewModel() {
    private val repository by lazy { LoginRepository() }
    //用LiveData的子类包裹要检测的值
    val mLoginUser: MutableLiveData<User> = MutableLiveData()

    fun login(userName: String, passWord: String) {
          //使用withContext(Dispatchers.IO) 切换线程
		   val response = withContext(Dispatchers.IO) { repository.login(userName, passWord) }
		   //这里直接调用 MutableLiveData setValue 方法把更新数据,如果是异步线程可以使用postValue
			mLoginUser.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-!!!?

发布了13 篇原创文章 · 获赞 46 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/a8688555/article/details/101803861