JetPack之 LifeCycle LiveData

LifeCycles

使用时候层次:「User的Activity」-》【中间BaseActivity】--> AppCompatActivity--》FragmentActivity --》 ComponentActivity

观察者模式

我们可以加上任意 对象观察Activity声明周期

getLifecycle().addObserver(presenter);
//----> getLifecycle().addObserver(任意一个我们想要加入的观察);

getLifecycle()返回这个类
  LifecycleRegistry ----》
    public LifecycleRegistry(@NonNull LifecycleOwner provider) {
        mLifecycleOwner = new WeakReference<>(provider);
        mState = INITIALIZED;
    }

addObserver(xxxx) 的运行时实现
          State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
        ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);

一开始一定是 INITIALIZED 状态

ComponentActivity

public class ComponentActivity extends androidx.core.app.ComponentActivity implements
        LifecycleOwner,
        ViewModelStoreOwner,
        HasDefaultViewModelProviderFactory,
        SavedStateRegistryOwner,
        OnBackPressedDispatcherOwner {
SavedStateRegistryOwner extends LifecycleOwner 

所以有事后用了这两个类,注意

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mSavedStateRegistryController.performRestore(savedInstanceState);
    ReportFragment.injectIfNeededIn(this);
    if (mContentLayoutId != 0) {
        setContentView(mContentLayoutId);
    }
}

这段代码的意思是,在Activity里面 ReportFragment.injectIfNeededIn(this); 注入,生成一个看不见的fragment在上面

有一个变量全程在记录Ativity 的声明周期状态

ReportFragment -->各种声明周期调用dispatch() 进行各种事件的分发

​ -- >handleLifecycleEvent ---> 「String next= getStateAfter」

​ ----> moveToState()---> sync()

​ 「目的是将状态正向推,或者反向推,和Activity的当前状态保持一致」

​ ---> backwardPass 或者 forwardPass

​ ----> mLifecycleObserver.onStateChanged---->「很多实现CompositeGeneratedAdaptersObserver ,FullLifecycleObserverAdapter ,SingleGeneratedAdapterObserver , ReflectiveGenericLifecycleObserver」

所有实现最终会走到 ReflectiveGenericLifecycleObserver ===》

ReflectiveGenericLifecycleObserver 构造方法,通过反射拿到带有OnLifecycleEvent注解的方法

LiveData

LiveData 不会单独使用,一般会和ViewModel一起用,封装集成ViewModel 提供返回数据的方法返回LiveData

viewModel.getLiveData.observe(xxxx, 实现);

LiveData 的逻辑结构是这个样子的观察者和被观察者

【被观察者】<--------【LiveData--- mVersion】<----------【其他观察者1---mLastVersion】

​ <-----------【其他观察者n----mLasteVersion】

observe 方法里面有这样两句话

LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);

putIfAbsent----> 从SafeIterableMap 拿观察者,如果有拿着用没有就放进去观察者

LiveData 的设置 setValue 查看他的机构 mVersion,

分发数据

dispatchingValue(null)

默认是null情况去循环迭代拿观察者,进行通知

considerNotify(ObserverWrapper observer)

同步 activity Livecycles 的状态 mLastversion = mVersion 更新 消息

然后回调到哦们的onChange

补充: 查看一下 LiveData 的postValue 方法:他是在子线程的

ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);

用了一个线程池,会帮助你从子线程切换到主线程上去

LiveData 封装 成 bus集合

通常我们项目中不可能到处用LiveData,我们用一个数组总线的方式控制

简单实现,开源有实现

public class LiveDataBus {
    //存放订阅者
    private Map> bus;
    private static LiveDataBus liveDataBus = new LiveDataBus();

    private LiveDataBus() {
        bus = new HashMap();
    }
    public static LiveDataBus getInstance() {
        return liveDataBus;
    }
    //注册订阅者
    public synchronized  MutableLiveData with(String key, Class type) {
        if(!bus.containsKey(key)){
            bus.put(key,new MutableLiveData());
        }
        return (MutableLiveData)bus.get(key);
    }
}






你可能感兴趣的:(JetPack之 LifeCycle LiveData)