一、首先,需要了解LiveData更新數(shù)據(jù)的兩種方式:
1、setValue()方法:只能在主線程調(diào)用。
2、postValue()方法:可以在任何線程中調(diào)用。
??通常,我們使用最多的是postValue方法,因為網(wǎng)絡(luò)請求接口這種耗時操作,一般是在子線程中做的,因此給LiveData對象進行賦值操作也在子線程。
二、LiveData與Observer的區(qū)別:
1、LiveData:當(dāng)每次重新賦值時就會觸發(fā)監(jiān)聽。
2、Observer:當(dāng)數(shù)據(jù)更新時才會觸發(fā)監(jiān)聽。
??換句話說,使用postValue()為LiveData對象進行賦值操作,第一次賦值1,第二次再賦值1,賦值進行了兩次,因此調(diào)用兩次監(jiān)聽。而Observer對象進行同樣的操作,監(jiān)聽事件只會調(diào)用一次。(也就是說LiveData并不關(guān)心你的值是否發(fā)生了改變,只要有賦值就觸發(fā)監(jiān)聽)
另外:LiveData對象跟生命周期進行綁定,當(dāng)頁面不可見時,更新通知將不會發(fā)送,當(dāng)從不可見到可見時,狀態(tài)發(fā)生改變,之前的通知可能會發(fā)送也可能不再發(fā)送,只更新最新的,中間值的改變不會展示通知發(fā)送過程;而Observer對象不與生命周期綁定,通知幾次就發(fā)送幾次。
三、使用LiveData對象和布局產(chǎn)生DataBinding雙向綁定的時候注意事項:
1、需要將LiveData對象進行定義的時候需要定義為String類型。
譬如:MultableLiveData<String>。
分析:?當(dāng)你在布局中使用到Int類型的數(shù)字時,很多人會將其定義為MutableLiveData<Int>類型的變量,因為方便對其進行加減操作,最后通過DataBinding在處理后重新賦值并更新UI。這里就需要使用到DataBinding中的雙向綁定。
??而如果你的字段定義為MutableLiveData<Int>類型,則勢必你需要在布局中這樣寫:拼接字符串。這樣就會發(fā)生問題,因為每次你更新的是MutableLiveData<Int>類型的變量而在布局中卻要將其更新成MutableLiveData<String>類型的,這樣UI會無法進行更新。因此必須將其在一開始就定義為MutableLiveData<String>類型的變量。
??換句話說,使用LiveData對象和DataBinding布局雙向綁定時,不能進行字段拼接,因為需要直接操作綁定在布局中的MutableLiveData<String>字段,用以通知更新UI布局。