探究 jetpack ViewModel、lifecycles、LiveData

目录

一.ViewModel:专门用来存放与界面相关的数据

二.Lifecycles:生命周期感知组件

三.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>()         正确写法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龚礼鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值