LiveData

LiveData

簡介

LiveData是一個可觀察的數(shù)據(jù)持有者類,與常規(guī)的Observable不同,LiveData可感知Activity、Fragment、Service的生命周期,確保LiveData僅更新處于活動生命周期狀態(tài)的組件觀察者。如果應用程序組件觀察者處于started或者resumed,則LiveData認為該組件處于活躍狀態(tài),該組件會收到LiveData的數(shù)據(jù)更新,而其他注冊的組件觀察者將不會收到任何數(shù)據(jù)更新。

作用

優(yōu)點

  • 保持UI與數(shù)據(jù)的一致性:LiveData遵循觀察者設(shè)計模式,當生命周期發(fā)生變化時,LiveData會通知對應的應用程序組件,數(shù)據(jù)發(fā)生變化時也會通知更新UI,類似于雙向綁定。
  • 避免內(nèi)存泄漏:因為LiveData綁定了LifecycleOwner,而LifecycleOwner是用來監(jiān)聽組件的生命周期情況下的,所以,當組件被destroy之后,這些Observer
    也會被自動清理。
  • 避免 Activity
    處于不活躍狀態(tài)的時候產(chǎn)生崩潰:如果觀察者(Observer)處于不活躍狀態(tài),則
    Observer 不會接受任何 LiveData 事件。
  • 不再手動處理生命周期:UI
    組件只是觀察相關(guān)數(shù)據(jù),而不會停止或恢復觀察,LiveData
    會根據(jù)具體生命周期的變化而自動管理。
  • 始終保持最新數(shù)據(jù):如果生命周期為非活躍狀態(tài),則會在由非活躍狀態(tài)轉(zhuǎn)為活躍狀態(tài)時接收最新數(shù)據(jù),如從后臺切換到前臺自動接收最新數(shù)據(jù)。
  • 正確處理配置更改:如果 Activity 或 Fragment
    因為設(shè)備配置發(fā)生變化而重新創(chuàng)建,比如屏幕旋轉(zhuǎn)等,也將會立即重新接收最新數(shù)據(jù)。

使用

通常LiveData都是和ViewModel一起出現(xiàn)的

  1. 在viewModel中創(chuàng)建LiveData(注:對應的Activity/Fragment
    要支持LifeCycle)

    class UserModel(application: Application) : AndroidViewModel(application) {    val userLiveData = MutableLiveData<User>()    private var mApplication: Application? = null}
    
  2. 數(shù)據(jù)更新

    val user:User = User()// setValue 在主線程中使用userLiveData.userLiveData.value = user
    // postValue 在子線程中使用(注:多次調(diào)用的時候可能只有最后一次有通知)userLiveData.userLiveData.postValue(user)
    
  3. 數(shù)據(jù)變化監(jiān)聽

    val userModel = ViewModelProvider(this).get(UserModel::class.java)
    userModel.userLiveData.observe(this, Observer<User> { t -> username.text = t.toString() })// 使用 LiveData 對象的 observeForever 方法來將一個沒有 LifecycleOwner 的類添加到觀察者列表中userModel.userLiveData.observeForever(this, Observer<User> { t -> username.text = t.toString() })// 不過使用 observeForever 獲得觀察者對象會一直處于活躍狀態(tài),此時就需要我們手動調(diào)用 removeObserver(Observer) 移除該觀察者。
    

在fragment中使用時

  • 使用viewLifecycleOwner 代替this 來綁定fragment
  • 注冊observe 要在onViewCreated 后面
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        mViewModel.personList.observe(viewLifecycleOwner) { }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容