欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android架構(gòu)組件LiveData使用詳解

 更新時(shí)間:2023年07月09日 08:48:58   作者:ttylinux  
這篇文章主要介紹了Android架構(gòu)組件LiveData使用詳解的相關(guān)資料,需要的朋友可以參考下

LiveData

LiveData是基于觀察者模式創(chuàng)建的,其中,LiveData是被觀察者,觀察者通過注冊(cè)方法,監(jiān)聽被觀察者的數(shù)據(jù)變化。LiveData在數(shù)據(jù)發(fā)生變化的時(shí)候,會(huì)通知觀察者。

LiveData是一個(gè)容器,存放數(shù)據(jù)的容器,它的數(shù)據(jù)變化可以被監(jiān)聽,也就是LiveData是一個(gè)被觀察者,如下,創(chuàng)建了一個(gè)存放String的數(shù)據(jù)容器currentName:

public class NameViewModel extends ViewModel {
// Create a LiveData with a String
private MutableLiveData<String> currentName;
? ?public MutableLiveData<String> getCurrentName() {
? ? ? ?if (currentName == null) {
? ? ? ? ? ?currentName = new MutableLiveData<String>();
? ? ? ?}
? ? ? ?return currentName;
? ?}
// Rest of the ViewModel...
}

監(jiān)聽LiveData數(shù)據(jù)變化,為L(zhǎng)iveData添加觀察者,如下,添加一個(gè)nameObserver,監(jiān)聽LiveData的數(shù)據(jù)變化,當(dāng)LiveData的數(shù)據(jù)發(fā)生變化的的時(shí)候,onChanged方法會(huì)被回調(diào),從而更新UI。

public class NameActivity extends AppCompatActivity {
? ?private NameViewModel model;
? ?@Override
? ?protected void onCreate(Bundle savedInstanceState) {
? ? ? ?super.onCreate(savedInstanceState);
? ? ? ?// Other code to setup the activity...
? ? ? ?// Get the ViewModel.
? ? ? ?model = new ViewModelProvider(this).get(NameViewModel.class);
? ? ? ?// Create the observer which updates the UI.
? ? ? ?final Observer<String> nameObserver = new Observer<String>() {
? ? ? ? ? ?@Override
? ? ? ? ? ?public void onChanged(@Nullable final String newName) {
? ? ? ? ? ? ? ?// Update the UI, in this case, a TextView.
? ? ? ? ? ? ? ?nameTextView.setText(newName);
? ? ? ? ? ?}
? ? ? ?};
? ? ? ?// Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
? ? ? ?model.getCurrentName().observe(this, nameObserver);
? ?}
}

更新LiveData數(shù)據(jù)的方式,使用setValue和postValue兩個(gè)方法

LiveData發(fā)布修改有setValue和postValue兩種方式,其中setValue只能在主線程調(diào)用,postValue則沒有這個(gè)限制

button.setOnClickListener(new OnClickListener() {
? ?@Override
? ?public void onClick(View v) {
? ? ? ?String anotherName = "John Doe";
? ? ? ?model.getCurrentName().setValue(anotherName);
? ?}
});

應(yīng)用架構(gòu)中的LiveData

LiveData 具有生命周期感知能力,遵循 activity 和 fragment 等實(shí)體的生命周期。您可以使用 LiveData 在這些生命周期所有者和生命周期不同的其他對(duì)象(例如 ViewModel 對(duì)象)之間傳遞數(shù)據(jù)。ViewModel 的主要責(zé)任是加載和管理與界面相關(guān)的數(shù)據(jù),因此非常適合作為用于保留 LiveData 對(duì)象的備選方法。您可以在 ViewModel 中創(chuàng)建 LiveData 對(duì)象,然后使用這些對(duì)象向界面層公開狀態(tài)。

 activity 和 fragment 不應(yīng)保留 LiveData 實(shí)例,因?yàn)樗鼈兊挠猛臼秋@示數(shù)據(jù),而不是保持狀態(tài)。此外,如果 activity 和 fragment 無需保留數(shù)據(jù),還可以簡(jiǎn)化單元測(cè)試的編寫。

擴(kuò)展LiveData

如果觀察者的生命周期處于 STARTED 或 RESUMED 狀態(tài),LiveData 會(huì)認(rèn)為該觀察者處于活躍狀態(tài)。以下示例代碼說明了如何擴(kuò)展 LiveData 類

public class StockLiveData extends LiveData<BigDecimal> {
????private StockManager stockManager;


????private SimplePriceListener listener = new SimplePriceListener() {
????????@Override
????????public void onPriceChanged(BigDecimal price) {
????????????setValue(price);
????????}
????};


????public StockLiveData(String symbol) {
????????stockManager = new StockManager(symbol);
????}


????@Override
????protected void onActive() {
????????stockManager.requestPriceUpdates(listener);
????}


????@Override
????protected void onInactive() {
????????stockManager.removeUpdates(listener);
????}
}

當(dāng)LiveData對(duì)象具有活躍觀察者時(shí), 會(huì)調(diào)用 onActive() 方法。這意味著,您需要從此方法開始觀察股價(jià)更新。

當(dāng) LiveData 對(duì)象沒有任何活躍觀察者時(shí),會(huì)調(diào)用 onInactive() 方法。由于沒有觀察者在監(jiān)聽,因此沒有理由與 StockManager 服務(wù)保持連接。

setValue(T) 方法將更新 LiveData 實(shí)例的值,并將更改告知活躍觀察者。

LiveData使用總結(jié)

  • 創(chuàng)建LiveData,使用viewModel類來包含

  • 創(chuàng)建觀察者Observer

  • 調(diào)用LiveData的observe方法將LiveData以及Observer建立起發(fā)布-訂閱關(guān)系

  • 在適當(dāng)?shù)臅r(shí)機(jī)調(diào)用LiveData的setValue或者postValue發(fā)布新數(shù)據(jù)通知觀察者

LiveData的優(yōu)點(diǎn)

  • 能夠確保數(shù)據(jù)和UI統(tǒng)一

    LiveData采用了觀察者模式,當(dāng)數(shù)據(jù)發(fā)生變化時(shí),主動(dòng)通知被觀察者。

  • 解決內(nèi)存泄露問題

    由于LiveData會(huì)在Activity/Fragment等具有生命周期的lifecycleOwner組件調(diào)用onDestory的時(shí)候自動(dòng)解綁,所以解決了可能存在的內(nèi)存泄漏問題。之前我們?yōu)榱吮苊膺@個(gè)問題,一般有注冊(cè)綁定的地方都要解綁(即注冊(cè)跟解綁要成對(duì)出現(xiàn)),而LiveData利用生命周期感知功能解決了這一問題,可以實(shí)現(xiàn)只需關(guān)心注冊(cè),而解綁會(huì)根據(jù)生命周期自動(dòng)進(jìn)行的功能。

  • 當(dāng)Activity停止時(shí)不會(huì)引起崩潰

    當(dāng)Activity組件處于inactive非活動(dòng)狀態(tài)時(shí),它不會(huì)收到LiveData數(shù)據(jù)變化的通知。

  • 不需要手動(dòng)處理生命周期的變化

    觀察者并不需要手動(dòng)處理生命周期變化對(duì)自身的邏輯的影響,只需要關(guān)心如何處理獲取到的數(shù)據(jù)。LiveData能夠感知Activity/Fragment等組件的生命周期變化,所以就完全不需要在代碼中告訴LiveData組件的生命周期狀態(tài),當(dāng)數(shù)據(jù)發(fā)生變化時(shí),只在生命周期處于active下通知觀察者,而在inactive下,不會(huì)通知觀察者。

  • 確保總能獲取到最新的數(shù)據(jù)

    什么意思呢?第一種情況,當(dāng)觀察者處于active活動(dòng)狀態(tài)。LiveData基于觀察者模式,所以當(dāng)數(shù)據(jù)發(fā)生變化,觀察者能夠馬上獲取到最新變化;第二種情況,當(dāng)觀察者處于inactive非活動(dòng)狀態(tài)。LiveData只能生命周期active下發(fā)送數(shù)據(jù)給觀察者。舉個(gè)例子,當(dāng)Activity處于后臺(tái)(inactive)時(shí),LiveData接收到了新的數(shù)據(jù),但這時(shí)候LiveData并不會(huì)通知該Activity,但是當(dāng)該Activity重新返回前臺(tái)(active)時(shí)會(huì)繼續(xù)接收到最新的數(shù)據(jù)。一句話概括,LiveData是粘性的。

  • configuration changes時(shí),不需要額外的處理來保存數(shù)據(jù)我們知道,當(dāng)你把數(shù)據(jù)存儲(chǔ)在組件中時(shí),當(dāng)configuration change(比如語言、屏幕方向變化)時(shí),組件會(huì)被recreate,然而系統(tǒng)并不能保證你的數(shù)據(jù)能夠被恢復(fù)的。當(dāng)我們采用LiveData保存數(shù)據(jù)時(shí),因?yàn)閿?shù)據(jù)和組件分離了。當(dāng)組件被recreate,數(shù)據(jù)還是存在LiveData中,并不會(huì)被銷毀。

  • 資源共享

    通過繼承LiveData類,然后將該類定義成單例模式,在該類封裝監(jiān)聽一些系統(tǒng)屬性變化,然后通知LiveData的觀察者。

LiveData源碼分析:

public interface Observer<T> {
??/**
???* Called when the data is changed.
???* @param t??The new data
???*/
??void onChanged(@Nullable T t);
}
// 注意,他是 abstract class
public abstract class LiveData<T> {
??// 只有 onStart 后,對(duì)數(shù)據(jù)的修改才會(huì)觸發(fā) observer.onChanged()
??public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {}
??// 無論何時(shí),只要數(shù)據(jù)發(fā)生改變,就會(huì)觸發(fā) observer.onChanged()
??public void observeForever(@NonNull Observer<T> observer) {}
}

到此這篇關(guān)于Android架構(gòu)組件LiveData使用詳解的文章就介紹到這了,更多相關(guān)Android架構(gòu)組件LiveData內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論