4. 从架构设计角度分析AAC源码-Lifecyce解析(续)

前言

当前主要针对LiveData和ViewModel两个组件源码解析。这两个组件实际是Lifecycle模块下的两个小组件,关联Lifecycle组件,下面进入正题。

LiveData组件

需求

LiveData组件:创建观察者观察activity(生命周期拥有者)的生命周期变化;然后对当前LiveData赋值,由生命周期拥有者的生命状态决定是否通知观察者(即回调观察者的方法)。

我们回顾一下Lifecycle组件:创建观察者观察activity(生命周期拥有者)的生命周期变化。

LiveData组件中的观察者和Lifecycle组件中的观察者是同样的设计思路。

架构设计

根据以上思路,我们做一个架构设计:

  1. LiveData组件定义一个观察者,观察生命周期的变化;
  • 在 LiveData内部需要自定义一个Lifecycle组件生命周期观察者观察生命周期拥有者生命周期变化,再去通知LiveData观察者;

  • 但是我们需要注意一点:LiveData只需要感知Destroy和非Destroy两种状态即可;非Destroy状态下通知观察者;Destroy状态下切断连接关系,方便回收;

  1. LiveData赋值。
  • 根据MVVM(或者MVP)模式,为了完成数据层和UI层解耦,数据赋值应该放在VM(ViewModel、或者MVP的P层),但是带来一个新的问题,数据赋值如果不在主线程中,那么回调更新UI必然报错,这个问题需要考虑到代码实现中。

代码实现

根据以上架构设计,我们做具体代码实现。

1. LiveData组件定义一个观察者,观察生命周期的变化

(1)定义一个观察者Observer,用于观察,onChanged方法表示通知观察者更新。

public interface Observer<T> {
    /**
     * Called when the data is changed.
     *
     * @param t The new data
     */
    void onChanged(T t);
}

(2)在 LiveData内部需要自定义一个Lifecycle组件生命周期观察者观察生命周期拥有者生命周期变化,再去通知LiveData观察者;

class LifecycleBoundObserver implements LifecycleEventObserver{
	@Override
    public void onStateChanged(@NonNull LifecycleOwner source,
                               @NonNull Lifecycle.Event event) {
	}
}

当前LifecycleBoundObserver类传递一个LiveData的Observer观察者对象,在LifecycleBoundObserver观察者回调onStateChanged方法时,调用当前Observer观察者的onChanged回调;

还需要定义一个ObserverWrapper对象,见名知意:包裹Observer对象.该对象的作用是扩展Observer观察者,扩展两个字段:(1)mActive用于判断当前Observer是否是活动状态;(2)mLastVersion表示当前Observer版本,对比LiveData版本,小于LiveData版本表示当前观察者没有被通知回调。

private abstract class ObserverWrapper {
        final Observer<? super T> mObserver;
        boolean mActive;
        int mLastVersion = START_VERSION;

	ObserverWrapper(Observer<? super T> observer) {
            mObserver = observer;
        }
}

2. LiveData赋值

赋值,我们这里做了2个方法,一个是setValue,一个是postValue。setValue方法必须在主线程中使用,postValue方法表示可以在子线程中做赋值工作。

@Override
public void postValue(T value) {
    super.postValue(value);
}

@Override
public void setValue(T value) {
    super.setValue(value);
}

更多细节表现在代码中,可自行查看,基于当期设计基础上,对我们从架构理解LiveData事半功倍。

代码地址和标签下面会在提供github地址。

ViewModel组件

需求

android被官方认可的是MVVM设计模式,其中M表示model数据模型,V表示view存,VM表示实际业务处理层,M和V是不会直接关联的,需要通过VM层提供M数据并且展示在V层上,换句话说,V(view)层观察VM(viewmodel)层的M(model)数据变化,如果发生了变化则展示,如果V层生命周期已结束,那么切断V和VM层的关联,并且切断VM层和M层之间的关联。

突然想到一个问题,model和bean(或者叫entity)之间有什么关系或者区别???

好像没啥区别哈!!!其实不然,model表示是数据模型,bean或entity表示实体类模型,model可以使用bean或entity代替,或者某些角度来说两者区别不大。但是bean或entity表示的是具体

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值