Android LiveData使用需要注意的地方
關(guān)于LiveData是什么以及基本使用方式,請(qǐng)參考官方文檔:developer.android.com/topic/libra…
簡(jiǎn)單來(lái)說(shuō),LiveData是一個(gè)可被觀察的數(shù)據(jù)容器類。它將數(shù)據(jù)包裝起來(lái),使得數(shù)據(jù)成為“被觀察者”,頁(yè)面成為“觀察者”。當(dāng)ViewModel存放頁(yè)面所需要的各種數(shù)據(jù)發(fā)生變化時(shí),通過(guò)LiveData的方式實(shí)現(xiàn)對(duì)頁(yè)面的通知,完成ViewModel與頁(yè)面組件之間的通信。
那么在使用時(shí)發(fā)現(xiàn)有以下幾個(gè)地方需要注意:
1.回調(diào)通知
LiveData的觀察者會(huì)在每次進(jìn)入活躍態(tài)時(shí)收到回調(diào),如果只想收到一次回調(diào)的話,可以使用SingleLiveEvent。要注意SingleLiveEvent僅限于一個(gè)觀察者。如果添加了多個(gè)則只會(huì)調(diào)用一個(gè),并且不能保證哪一個(gè)。
2.數(shù)據(jù)倒灌
所謂數(shù)據(jù)倒灌是一種形象的說(shuō)法,它是指先setValue/postValue,后調(diào)用observe(new Obs()),至此收到了回調(diào)。然后再調(diào)用observe(new anotherObs()),如果還能收到第一次的回調(diào),也就是舊數(shù)據(jù)。解決方案可以參考開(kāi)源項(xiàng)目:UnPeek-LiveData。
3.事件包裝
上面提到SingleLiveEvent僅限于一個(gè)觀察者,如果需要多個(gè)觀察者該如何處理呢,方案就是使用事件包裝。定義一個(gè)數(shù)據(jù)包裝器,內(nèi)部判斷事件是否消費(fèi)了,被消費(fèi)后則不再回調(diào)通知。代碼如下:
/**
* 事件包裝器,明確地管理事件是否已經(jīng)被處理
* @param <T> ViewModel中的數(shù)據(jù),比如:
* MutableLiveData<LiveEventWrapper<String>>()
*/
public class LiveEventWrapper<T> {
private T content;
private boolean hasBeenHandled;
public LiveEventWrapper(T content) {
this.content = content;
}
/**
* Returns the content and prevents its use again.
*/
public T getContentIfNotHandled() {
if (hasBeenHandled) {
return null;
} else {
hasBeenHandled = true;
return content;
}
}
/**
* Returns the content, even if it's already been handled.
*/
public T peekContent() {
return content;
}
public boolean isHasBeenHandled() {
return hasBeenHandled;
}
}
或者
import androidx.annotation.NonNull;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Observer;
public class CleanLiveData<T> extends LiveData<T> {
private boolean hasModified = false;
@Override
public void observe(@NonNull LifecycleOwner owner, @NonNull final Observer<? super T> observer) {
super.observe(owner, new Observer<T>() {
private boolean hasIntercept = false;
@Override
public void onChanged(T t) {
if (!hasModified || hasIntercept) {
observer.onChanged(t);
}
hasIntercept = true;
}
});
}
@Override
public void observeForever(@NonNull final Observer<? super T> observer) {
super.observeForever(new Observer<T>() {
private boolean hasIntercept = false;
@Override
public void onChanged(T t) {
if (!hasModified || hasIntercept) {
observer.onChanged(t);
}
hasIntercept = true;
}
});
}
@Override
public void setValue(T value) {
super.setValue(value);
hasModified = true;
}
@Override
public void postValue(T value) {
super.postValue(value);
hasModified = true;
}
}
總結(jié)來(lái)看,以上現(xiàn)象基本都是由于LiveData的粘性特性引發(fā)的,因此在使用LiveData的時(shí)一定要搞清楚它的概念和原理。
以上就是Android LiveData使用需要注意的地方的詳細(xì)內(nèi)容,更多關(guān)于Android LiveData使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Android Jetpack架構(gòu)組件Lifecycle詳解
- Android Jetpack架構(gòu)組件 ViewModel詳解
- Android 生命周期架構(gòu)組件使用方法
- Android架構(gòu)組件Room的使用詳解
- Android架構(gòu)組件Room指南
- Android-ViewModel和LiveData使用詳解
- Android mvvm之LiveData原理案例詳解
- Android 基于MediatorLiveData實(shí)現(xiàn)紅點(diǎn)的統(tǒng)一管理
- 詳解Android JetPack之LiveData的工作原理
- Android架構(gòu)組件LiveData使用詳解
相關(guān)文章
Flutter 構(gòu)建一個(gè)常用的頁(yè)面框架
大多數(shù) App 中都會(huì)有底部導(dǎo)航欄,通過(guò)底部導(dǎo)航欄切換實(shí)現(xiàn)不同頁(yè)面之間的切換。在Flutter 中提供了 BottomNavigationBar組件實(shí)現(xiàn)底部導(dǎo)航。本篇介紹通過(guò) BottomNavigationBar和 IndexedStack構(gòu)建最為常見(jiàn)的 App 頁(yè)面框架。2021-05-05
詳解Android ConstraintLayout 約束布局的用法
本篇文章主要介紹了詳解Android ConstraintLayout 約束布局的用法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
Android仿新浪微博自定義ListView下拉刷新(4)
這篇文章主要為大家詳細(xì)介紹了Android仿新浪微博自定義ListView下拉刷新,重點(diǎn)介紹了Adapter的詳細(xì)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
Android 系統(tǒng)實(shí)現(xiàn)多種開(kāi)機(jī)動(dòng)畫和logo切換功能
這篇文章主要介紹了android 系統(tǒng)實(shí)現(xiàn)多種開(kāi)機(jī)動(dòng)畫和logo切換功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-12-12
Android 虛擬按鍵適配動(dòng)態(tài)調(diào)整布局的方法
今天小編就為大家分享一篇Android 虛擬按鍵適配動(dòng)態(tài)調(diào)整布局的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Android 一鍵清理、內(nèi)存清理功能實(shí)現(xiàn)
這篇文章主要介紹了Android 一鍵清理、內(nèi)存清理功能實(shí)現(xiàn),非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-01-01

