Jetpack -- LiveData使用与源码流程分析

简介
  • 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);
}
整个分析流程如下
  • 在这里插入图片描述
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wjxbless

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值