美文网首页
kotlin MutableLiveData 工作流程及原理

kotlin MutableLiveData 工作流程及原理

作者: coke613 | 来源:发表于2023-07-04 14:33 被阅读0次

    MutableLiveData 它是Android Jetpack 架构组件中的一部分,用于在组件(如 Activity、Fragment、ViewModel 等)之间传递和共享数据。它是一种基于观察者-订阅者模式的数据持有类.

    MutableLiveData工作原理
      1. 数据存储: MutableLiveData 内部维护着一个数据对象.可以是任意类型.这个数据对象可以通过setValue()方法进行更新.
      1. 生命周期感知: MutableLiveData 与组件的生命周期相关联,它会在组件活跃状态下通知观察者(例如activity 或者 fragment),并在组件非活跃状态下自动取消通知.以防止潜在的内存泄露.
      1. 观察者模式: MutableLiveData 实现了观察者模式,允许其他组件注册为观察者并接收数据的更新通知.当数据发生变化时,注册的观察者将收到更新的数据.
        在观察者- 订阅者模式中,存在两个主要角色:
    • a. 观察者(Observer): 观察者是一个对象,它监听被观察对象的变化,并在变化时接收通知.在Android 中,通常是ui组件如(Activity,Fragment) 充当观察者,它们可以订阅并接收被观察者对象的变化.
    • b. 被观察者(Observable):被观察者是一个对象,它持有数据并在数据发生变化时通知观察者.在Android中 'MutableLiveData' 就是一种被观察者对象,它可以持有数据,并在数据发生变化的时候通知所有观察者.
    • 4.线程安全: MutableLiveData 保证数据更新操作是在主线程上进行的.这样可以确保观察者在主线程接受数据变化的通知,以便正确处理UI更新.
    MutableLiveData 执行流程
    // 在 ViewModel 中
    val data = MutableLiveData<String>()
    
    // 在 ViewModel 中 更新数据
    fun updateData(newData: String) {
        data.value = newData
    }
    
    // 在 Activity 中订阅数据变化
    viewModel.data.observe(this, Observer { value ->
        // 处理数据变化,更新 UI 等操作
    })
    
    

    MutableLiveData是LiveData 的子类,具有可变的特性,可以通过调用setValue()或者postValue()方法来更新数据.

    setValue, postValue 有什么区别.

    setValue()和postValue()是MutableLiveData类中用于更新数据的两种方式.它们在使用方式和线程安全性方面略有不同.

    • setValue(): 该方法是在主线程中调用的,用于更新MutableLiveData的值.这就意味着你只能在主线程中调用setValue(),否则会抛出异常.setValue()方法会立即将新的值分发给所有的观察者,即时当前线程是主线程.

    • postValue(): 该方法是线程安全的,可以在任何线程中调用,包括主线程和后台线程.它会将数据更新的操作添加到主线程的消息队列中,在主线程空闲时进行处理.这样可以确保数据的更新都是在主线程上进行.避免了跨线程访问的问题.

    区别总结如下:
    • setValue()方法必须在主线程中调用,立即分发数据更新给观察者.
    • postValue()方法可以在任何线程中调用,将数据更新操作添加到消息队列中,确保在主线程上进行数据分发.
    // 在 ViewModel 中
    val data = MutableLiveData<String>()
    
    // 在 ViewModel 中 更新数据  确保在主线程调用
    fun updateData(newData: String) {
        data.value = newData
    }
    
    //在 ViewModel 子线程中更新数据.
    fun postUpdateData(newData: String){
        Thread{
            data.postValue(newData)
        }.start()
    }
    
    
    // 在 Activity 中订阅数据变化
    viewModel.data.observe(this, Observer { value ->
        // 处理数据变化,更新 UI 等操作
    })
    
    

    相关文章

      网友评论

          本文标题:kotlin MutableLiveData 工作流程及原理

          本文链接:https://www.haomeiwen.com/subject/rtzcudtx.html