简介

  • LiveData是给定生命周期的一个数据持有类
  • LiveData配合ViewModel可以将Controller中的逻辑更加简单,在数据进行变动的时候可以通过注入观察者来监听数据的变化
  • LiveData可以感知实现LifecycleOwner组件的生命周期,只有在上述组件的激活状态 (STARTED, RESUMED) 才会通知观察者数据更新
  • 当组件的生命周期到了DESTROYED状态的时候,添加的观察者将会被自动移除

使用示例

  • 配合ViewModel使用
class MyViewModel : ViewModel() {
// MutableLiveData 是 LiveData 的一个最简单实现,它可以接收数据更新并通知观察者
private var mLikedNumber: MutableLiveData<Int>? = null


fun getLikedNumber(): MutableLiveData<Int> {
if (mLikedNumber == null) {
mLikedNumber = MutableLiveData()
mLikedNumber!!.value = 0
}
return mLikedNumber!!
}


fun setLikedNumber(value: Int) {
mLikedNumber!!.value = mLikedNumber!!.value!! + value
}
}



class MainActivity : AppCompatActivity() {
var mViewModel: MyViewModel? = null
private lateinit var activityMainBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
// ViewModel和控制器绑定
mViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
// 给LiveData设置一个观察者,观察数据的变化,数据发生变化,就直接更新到View之上
mViewModel!!.getLikedNumber().observe(this, Observer {integer ->
integer?.let {
textView.setText(integer.toString())
}
})
button.setOnClickListener({
mViewModel!!.setLikedNumber(1)
})
button2.setOnClickListener({
mViewModel!!.setLikedNumber(2)
})
}
}

实际应用

  • 我们一般可以定义一个Repository负责从网络或者数据库中获取数据,下面是数据的处理链以及实际应用实现(​​具体代码可以参考​​)
//  Repository
class HomeRepository (loadState : MutableLiveData<State>) : BaseArticleRepository(loadState) {
fun loadBanner(liveData: MutableLiveData<BaseResponse<List<BannerResponse>>>) {
apiService.loadBanner()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(BaseObserver(liveData, loadState, this))
}


fun loadHomeArticle(pageNum : Int, liveData: MutableLiveData<BaseResponse<HomeArticleResponse>>) {
apiService.loadHomeArticle(pageNum)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(BaseObserver(liveData, loadState, this))
}


fun loadTopArticle(liveData: MutableLiveData<BaseResponse<List<Article>>>) {
apiService.loadTopArticle()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(BaseObserver(liveData, loadState, this))
}
}

// ViewModel
class HomeViewModel(application: Application) :
BaseArticleViewModel<HomeRepository>(application) {
val mBannerData : MutableLiveData<BaseResponse<List<BannerResponse>>> = MutableLiveData()
val mHomeArticleData : MutableLiveData<BaseResponse<HomeArticleResponse>> = MutableLiveData()
val mTopArticleData : MutableLiveData<BaseResponse<List<Article>>> = MutableLiveData()


fun loadBanner() {
mRepository.loadBanner(mBannerData)
}


fun loadHomeArticleData(pageNum : Int) {
mRepository.loadHomeArticle(pageNum, mHomeArticleData)
}


fun loadTopArticle() {
mRepository.loadTopArticle(mTopArticleData)
}
}

// View
mViewModel.mBannerData.observe(this, Observer { response ->
response?.let {
setBannerData(it.data)
}
})

实现原理

  • 了解了如何使用LiveData,那么就从源码的角度对LiveData的观察者模式进行解读,对其再进行深入的理解
添加观察者的方法observe说起
@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
assertMainThread("observe");
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// ignore
return;
}
// 将LifecycleOwner对象(Activity, Fragment, Service)封装成LifecycleBoundObserver对象
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
// 对observer的唯一性进行判断
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
if (existing != null && !existing.isAttachedTo(owner)) {
throw new IllegalArgumentException("Cannot add the same observer"
+ " with different lifecycles");
}
if (existing != null) {
return;
}
// 添加生命周期的观察者
owner.getLifecycle().addObserver(wrapper);
}
上面看到如果当前组件处于非DESTROYED状态就会封装成LifecycleBoundObserver
class LifecycleBoundObserver extends ObserverWrapper implements LifecycleEventObserver {
@NonNull
final LifecycleOwner mOwner;


LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer<? super T> observer) {
super(observer);
mOwner = owner;
}


@Override
boolean shouldBeActive() {
return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
}


// 组件生命周期发生改变的回调方法
@Override
public void onStateChanged(@NonNull LifecycleOwner source,
@NonNull Lifecycle.Event event) {
// 如果是DESTROYED状态则移除观察者
if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
removeObserver(mObserver);
return;
}
// 将状态传入activeStateChanged
activeStateChanged(shouldBeActive());
}


@Override
boolean isAttachedTo(LifecycleOwner owner) {
return mOwner == owner;
}


@Override
void detachObserver() {
mOwner.getLifecycle().removeObserver(this);
}
}

void activeStateChanged(boolean newActive) {
// 状态不发生改变不做处理
if (newActive == mActive) {
return;
}
// immediately set active state, so we'd never dispatch anything to inactive
// owner
mActive = newActive;
boolean wasInactive = LiveData.this.mActiveCount == 0;
LiveData.this.mActiveCount += mActive ? 1 : -1;
// 分别对是否在激活状态的observer个数进行+1, -1
if (wasInactive && mActive) {
onActive(); // +1 使得 从0->1 添加观察者
}
if (LiveData.this.mActiveCount == 0 && !mActive) {
onInactive();// -1使得从1->0 移除观察者
}
if (mActive) {
dispatchingValue(this);
}
}
dispatchingValue
void dispatchingValue(@Nullable ObserverWrapper initiator) {
if (mDispatchingValue) {
mDispatchInvalidated = true;
return;
}
mDispatchingValue = true;
do {
mDispatchInvalidated = false;
if (initiator != null) {
// 如果observer不为空,通知回调
considerNotify(initiator);
initiator = null;
} else {
// observer为空,则将mObservers容器中的值进行遍历调用,将数据分发给各个观察者
for (Iterator<Map.Entry<Observer<? super T>, ObserverWrapper>> iterator =
mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
considerNotify(iterator.next().getValue());
if (mDispatchInvalidated) {
break;
}
}
}
} while (mDispatchInvalidated);
mDispatchingValue = false;
}

private void considerNotify(ObserverWrapper observer) {
if (!observer.mActive) {
return;
}
// Check latest state b4 dispatch. Maybe it changed state but we didn't get the event yet.
//
// we still first check observer.active to keep it as the entrance for events. So even if
// the observer moved to an active state, if we've not received that event, we better not
// notify for a more predictable notification order.
if (!observer.shouldBeActive()) {
observer.activeStateChanged(false);
return;
}
if (observer.mLastVersion >= mVersion) {
return;
}
observer.mLastVersion = mVersion;
// 回调可观察对象的onChange()方法即我们在View中重写的方法
observer.mObserver.onChanged((T) mData);
}

整个分析流程如下