zoukankan      html  css  js  c++  java
  • 开发者如何使用 LiveData

    LiveData.java
    ------------------------------
    @MainThread
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
    assertMainThread("observe");
    if (owner.getLifecycle().getCurrentState() == DESTROYED) {
    // ignore
    return;
    }
    LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, 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);
    }

    @MainThread
    protected void setValue(T value) {
    assertMainThread("setValue");
    mVersion++;
    mData = value;
    dispatchingValue(null);
    }

    protected void postValue(T value) {
    boolean postTask;
    synchronized (mDataLock) {
    postTask = mPendingData == NOT_SET;
    mPendingData = value;
    }
    if (!postTask) {
    return;
    }
    ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
    }

    private final Runnable mPostValueRunnable = new Runnable() {
    @Override
    public void run() {
    Object newValue;
    synchronized (mDataLock) {
    newValue = mPendingData;
    mPendingData = NOT_SET;
    }
    //noinspection unchecked
    setValue((T) newValue);
    }
    };

    @Nullable
    public T getValue() {
    Object data = mData;
    if (data != NOT_SET) {
    //noinspection unchecked
    return (T) data;
    }
    return null;
    }
    observe(LifecycleOwner,?Observer<? super T>) 是在 LiveData 里注册一个观察者,如果数据发生变化会通知这些观察者。

    setValue(T) 用于在主线程里面修改数据

    postValue(T) 用于在子线程里面修改数据,当然最终还是会调到到 setValue(T)?

    getValue(T) 就是get方法很好理解吧,在简单流程里使用是不需要用到的,像在Android DataBinding架构里才会用到。

    setValue(T) 最终调用到?dispatchingValue()

    private SafeIterableMap<Observer<? super T>, ObserverWrapper> mObservers =
    new SafeIterableMap<>();

    void dispatchingValue(@Nullable ObserverWrapper initiator) {
    if (mDispatchingValue) {
    mDispatchInvalidated = true;
    return;
    }
    mDispatchingValue = true;
    do {
    mDispatchInvalidated = false;
    if (initiator != null) {
    considerNotify(initiator);
    initiator = null;
    } else {
    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(http://www.my516.com)) {
    observer.activeStateChanged(false);
    return;
    }
    if (observer.mLastVersion >= mVersion) {
    return;
    }
    observer.mLastVersion = mVersion;
    //noinspection unchecked
    observer.mObserver.onChanged((T) mData);
    }
    ————————————————

  • 相关阅读:
    [国嵌攻略][183][账号管理子系统设计]
    [国嵌攻略][182][Sqlite嵌入式数据库移植]
    [国嵌攻略][181][线程池技术优化]
    [国嵌攻略][180][加密传输优化]
    [国嵌攻略][179][OpenSSL加密系统]
    [国嵌攻略][178][网络安全传输系统框架搭建]
    [国嵌攻略][177][网络安全传输系统模型设计]
    [国嵌攻略][174][CGI快速入门-网页控制LED]
    [国嵌攻略][173][BOA嵌入式服务器移植]
    [转载]Architecture and framework
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11384641.html
Copyright © 2011-2022 走看看