MVC:
M:数据model
V:视图View
C:controller
要实现view上面的各种操作,需要一些逻辑处理,而MVC模式就是将所有操作都放在controller里面写
比如我们在activy_main.xml中需要在某一控件a上面添加一些东西,而只有当a上面为空时才能添加,那么
这时候需要判断a是否为空,若为空则添加数据,不为空则做其他操作。mvc模式则是将这全部过程(包括
什么时候操作这样的逻辑处理,以及添加数据这样的对视图的处理)都放在 MainActivity(controller)里面
写,这样的模式就是MVC模式。
MVP:
M:数据model
V:视图View
P:Presenter(对视图操作的逻辑的处理)
MVP就是在数据Model与视图View之间加了一个P(presenter)用于对视图逻辑上的处理,而视图就只负责
视图自己的处理,比如添加数据,变亮变暗等,
比如我们在activy_main.xml中需要在某一控件a上面添加一些东西,而只有当a上面为空时才能添加,那么
这时候需要判断a是否为空,若为空则添加数据,不为空则做其他操作。那么对于视图的逻辑的处理就是判
端该视图是否为空,而View只负责添加数据,至于什么时候添加数据就有Presenter来决定。
MVVM:
M:数据model
V:视图View
VM:ViewModel
MVVM,就是在model和View之间增加一层ViewModel,将数据经过ViewModel处理之后,在拿到View上去显示,经过
ViewModel处理的数据,其生命周期和界面的生命周期是一样的,这就简化了我们需要对界面中数据生命周期需求的处理,
比如我们在activy_main.xml中需要在某一控件a上面添加一些东西b,但是希望b能够在a上面一直存在,就算a所在界面被
重启,b依然存在,但同时如果a所在界面被销毁,那么b就消失了,那么这时就需要使用ViewModel。另一种情况,若b的数
据是在改变的,一般情况都会使用callback函数回调或者接口,用ViewModel中的LiveData就不需要函数的回调,LiveData管理
的就是活的数据,当LiveData中的数据被改变时,同时视图中的数据也会相应的改变。
ViewModel的使用:
1:导入依赖库:
dependencies {
// ViewModel
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1")
// LiveData
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.3.1")
.......
}
2:建立一个类继承与ViewModel,在里面进行数据处理
在ViewModel里面所得的数据就直接和对应的界面的生命周期是一样的
class NetWork :ViewModel(){
val content1 = 20
//mutable可变的,表示里面的内容是可变的 LiveData对象
val content:MutableLiveData<String> = MutableLiveData()
}
3:在外部获取ViewModel对象
/*
通过ViewModelProvider(this).get(MyViewModel::class.java)来获取viewmodel这个对象
必须要通过ViewModelProvider来取得ViewModel这个对象,ViewModelProvider里面包含了
lifeowner(生命周期的监听者),但是这个方法只能用来创造没有没有构造函数的ViewModel,
若是有其他的需求,如ViewModel里面包含了构造函数的,就只能自定义ViewModelProvider,
ViewModel所保存的数据是随着整个页面的生命周期的
*/
val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
//通过对象访问数据就行
mtextView.text = viewModel.content1
//这个是管理活着的数据,也就是动态数据,(LiveData类型的数据)通过Observe来进行观察
val viewModel = ViewModelProvider(this).get(NetWork::class.java)
viewModel.content.observe(this, Observer {
//this,是谁要来观察,it是content的内容,当content的内容一旦改变
//会将it值传过来,需要做什么
//和callback的作用是一样的,但是数据一多就需要定义多个callback,这个就不需要
mtextView.text = it
})
}
以上是没有参数的构造函数的ViewModel类的使用,下面是有参数的构造函数的(都需要导入依赖库)
1:建立一个类继承与ViewModel,在里面进行数据处理
class MyViewModel(content:String):ViewModel() {
var content1="android+$content"
}
2:建立一个类继承与ViewModelProvider.NewInstanceFactory,实现其create方法,其中
返回的“aaaaaaa”就是传入ViewModel()中构造函数里面的参数
class ViewModelProviderFactory: ViewModelProvider.NewInstanceFactory() {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return MyViewModel("aaaaaaaaa") as T
}
}
3:获取对象及数据方法和没有参数的一样