…MVP已经火爆的好几年了,自己也写了一些对于MVP的理解
Android常见的MVP模式与封装,感兴趣的可以去看看,哈哈,但是用了几年发现这玩意还是有很大的缺陷,最不爽的就是,写下来就是接口接口接口接口,虽然可以用契约类写在一起,或者直接用模板去生成对应模块的接口以及类,但是也显得麻烦。还要自己去定制一个个模板类。还有就是如果P层持有的VIew没有处理好。也会照成内存的泄露。所以对于这些原因,加上Google推荐使用Android Jetpack来构建项目,MVVM就值得大家去学习一下啦。!!
什么是MVVM?一开始听到这个玩意,也是一脸的迷茫,啥玩意? 去看了一下,就是这个Model-View-ViewModel。
M和V,跟MVP中的没啥区别,要我说就是一个意思,对应的就是获取数据的类和界面,activity/fragment等。重点就在于这个ViewModel,这才是我们要正在要学习的东西。
二话不说,官网的介绍就是最好的学习资料。看下官网对他的描述
总的来说就是为activity或者fragment准备和管理业务逻辑。照我看来就跟MVP中的P差不多,不同之处在于他们怎样把数据传递给View层而已。而P呢,是持有View的接口引用去回调传递数据,而ViewModel则是通过LiveData去传递数据。
还有一些特性,具有生命周期,就是在依附的Activity或者Fragment没要销毁之前数据是不会丢失,
或者屏幕翻转等。
使用ViewModel时一定要注意,不能让其引用Activity或View,否则可能导致内存泄漏
官网介绍
可观察并且具有生命周期感知的一个玩意。什么意思呢?那就看看例子
需求:获取服务器数据并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 方法把更新数据,如果是异步线程可以使用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-!!!?