目录
三.LiveData:是Jetpack提供的一种响应式编程组件,它可以包含任何类型的数据,并在数据发生变化的时候通知给观察者。
简介:jetpack是一个开发组件工具集,它的主要目的的帮助我们编写出更加简洁的代码,并简化我们的开发过程
一.ViewModel:专门用来存放与界面相关的数据
ViewModel生命周期比Activity长
/**
* 基础的viewModel 用于处理数据和将数据返回给ui层
*/
class MainViewModel(count:Int) : ViewModel() {
var counter = count
fun countAdd(){
counter++
}
}
/**
* 可以将值传给ViewModel,并且构建ViewModel,
* 因为在Activity中不能创建ViewModel,因为ViewModel生命周期比Activity长
*/
class MainViewModelFactory(private val count:Int) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T = MainViewModel(count) as T
}
class MainActivity : AppCompatActivity() {
lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//得到viewMode
viewModel = ViewModelProvider(this, MainViewModelFactory(tv.text.toString().toInt())).get(
MainViewModel::class.java
)
tv.setOnClickListener {
//操作数据
viewModel.countAdd()
//得到数据
tv.text = viewModel.counter.toString()
}
}
}
二.Lifecycles:生命周期感知组件
/**
* 感知生命周期
*
* java8的版本 需要在gradle中添加implementation 'android.arch.lifecycle:common-java8:1.1.1'
*/
class MyObserver : DefaultLifecycleObserver {
val TAG = "MyObserver"
override fun onCreate(owner: LifecycleOwner) {
Log.v(TAG,"onCreate")
Log.v(TAG,"当前生命周期状态=${owner.lifecycle.currentState.name}")
}
override fun onStart(owner: LifecycleOwner) {
Log.v(TAG,"onStart")
Log.v(TAG,"当前生命周期状态=${owner.lifecycle.currentState.name}")
}
override fun onResume(owner: LifecycleOwner) {
Log.v(TAG,"onResume")
Log.v(TAG,"当前生命周期状态=${owner.lifecycle.currentState.name}")
}
override fun onPause(owner: LifecycleOwner) {
Log.v(TAG,"onPause")
Log.v(TAG,"当前生命周期状态=${owner.lifecycle.currentState.name}")
}
override fun onDestroy(owner: LifecycleOwner) {
Log.v(TAG,"onDestroy")
Log.v(TAG,"当前生命周期状态=${owner.lifecycle.currentState.name}")
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//添加生命周期组件监听
lifecycle.addObserver(MyObserver())
}
}
三.LiveData:是Jetpack提供的一种响应式编程组件,它可以包含任何类型的数据,并在数据发生变化的时候通知给观察者。
/**
* 基础的viewModel 用于处理数据和将数据返回给ui层
* 添加liveData 进行响应式监听
*/
class MainViewModel(count:Int) : ViewModel() {
val counter :LiveData<Int>
get() = _counter
private var _counter = MutableLiveData<Int>()
init {
_counter.value = count
}
fun countAdd(){
_counter.value?.plus(1)
}
}
class MainActivity : AppCompatActivity() {
lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//得到viewMode
viewModel = ViewModelProvider(this, MainViewModelFactory(tv.text.toString().toInt())).get(
MainViewModel::class.java
)
tv.setOnClickListener {
//操作数据
viewModel.countAdd()
}
viewModel.counter.observe(this, Observer { count->tv.text = count.toString() })
}
}
map()用于将数据修改成对外的数据格式
/**
* 基础的viewModel 用于处理数据和将数据返回给ui层
* 添加liveData 进行响应式监听
* 如果_user本身是个User类型的LiveData,返回需要变成String类型,则需要用到map()
*/
class MainViewModel(user:User) : ViewModel() {
val user :LiveData<String>
get() = Transformations.map(_user){
user->user.toString()
}
private var _user = MutableLiveData<User>()
init {
_user.value = user
}
fun countAdd(){
_user.value?.apply {
User(this.userName,this.phone+1,this.address)
}
}
}
switchMap():如果ViewModel中的某个LiveData对象需要调用另外的方法获取,那么我们就可以借助switchMap()方法,将LiveData转化成可观察的对象
/**
* 基础的viewModel 用于处理数据和将数据返回给ui层
* 添加liveData 进行响应式监听
* switchMap()将Repository中的
*/
class MainViewModel(user:User) : ViewModel() {
val user : LiveData<User>?
get() = Transformations.switchMap(_user){
user->Repository.getUser(user)
}
private var _user = MutableLiveData<String>()
//此处调用是为了让Transformations.switchMap运行 这样就可以观察Repository中的liveData
init {
_user.value = user.userName
}
}
object Repository {
fun getUser(userId:String) :LiveData<User>{
val liveData = MutableLiveData<User>()
liveData.value = User(userId, "", "0")
return liveData
}
}
注意:MutableLiveData不要设置默认值,这样观察者首次会收到默认值的消息,可能导致观察者事件有问题
private val _openSendMsg = MutableLiveData<Boolean>(false) 错误写法private val _openSendMsg = MutableLiveData<Boolean>() 正确写法