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)的
-
在viewModel中創(chuàng)建LiveData(注:對應的Activity/Fragment
要支持LifeCycle)class UserModel(application: Application) : AndroidViewModel(application) { val userLiveData = MutableLiveData<User>() private var mApplication: Application? = null} -
數(shù)據(jù)更新
val user:User = User()// setValue 在主線程中使用userLiveData.userLiveData.value = user // postValue 在子線程中使用(注:多次調(diào)用的時候可能只有最后一次有通知)userLiveData.userLiveData.postValue(user) -
數(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) { }
}