美文网首页
LiveData使用笔记

LiveData使用笔记

作者: 紫鹰 | 来源:发表于2021-04-19 15:04 被阅读0次

    是什么

    是一种可观察的数据存储器类。

    特点

    1、数据保持更新
    2、具有生命周期感知能力(如果观察者(由 Observer 类表示)的生命周期处于 STARTED 或 RESUMED 状态,则 LiveData 会认为该观察者处于活跃状态。LiveData 只会将更新通知给活跃的观察者。为观察 LiveData 对象而注册的非活跃观察者不会收到更改通知。)

    使用

    1.通常在ViewModel中创建(防止activity、fragment臃肿;达到分离关注点目的)

    2.创建

    val currentName: MutableLiveData<String> by lazy {
        MutableLiveData<String>()
    }
    

    3.观察(绑定)

       // Create the observer which updates the UI.
        val nameObserver = Observer<String> { newName ->
            // Update the UI, in this case, a TextView.
            nameTextView.text = newName
        }
    
        // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
        model.currentName.observe(this, nameObserver)
    

    4.数据变化

    val anotherName = "John Doe"
    currentName.setValue(anotherName)
    

    调用 setValue() 或 postValue() 都会触发观察者并更新界面。

    扩展使用

    1.扩展

    class StockLiveData(symbol: String) : LiveData<BigDecimal>() {
      private val stockManager = StockManager(symbol)
    
      private val listener = { price: BigDecimal ->
        value = price
      }
    
      override fun onActive() {
        stockManager.requestPriceUpdates(listener)
      }
    
      override fun onInactive() {
        stockManager.removeUpdates(listener)
      }
    }
    

    2.转换

    val userLiveData: LiveData<User> = UserLiveData()
    val userName: LiveData<String> = Transformations.map(userLiveData){
        user -> "${user.name} ${user.lastName}"
    }
    

    3.合并多个数据源
    MediatorLiveData 是 LiveData 的子类,允许您合并多个 LiveData 源。只要任何原始的 LiveData 源对象发生更改,就会触发 MediatorLiveData 对象的观察者。

    LiveData liveData1 = ...;
    LiveData liveData2 = ...;
    
    MediatorLiveData liveDataMerger = new MediatorLiveData<>();
    liveDataMerger.addSource(liveData1, value ->        liveDataMerger.setValue(value));
    liveDataMerger.addSource(liveData2, value -> liveDataMerger.setValue(value));
    

    4.将协程与 LiveData 一起使用

    val user: LiveData<User> = liveData {
        val data = database.loadUser() // loadUser is a suspend function.
        emit(data)
    }

    相关文章

      网友评论

          本文标题:LiveData使用笔记

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