乐趣区

关于android:Android-AAC架构实践

  • LiveData 如何实现数据更新
  • LiveData 如何实现同 activity 申明周期绑定
  • viewModel 如何实现数据共享
  • viewModel 如何实现数据保留

本文就如上问题联合 aac 框架源码进行逐渐解析 ## 一.LiveData 实现数据更新 既然是监测数据更新, 必定是应用到观察者模式

  • 观察者 GenericLifecycleObserver, 其中 LifecycleObserver 为空接口
public interface GenericLifecycleObserver extends LifecycleObserver {void onStateChanged(LifecycleOwner source, Lifecycle.Event event);
}
  • 被观察者
public abstract class Lifecycle {public abstract void addObserver(@NonNull LifecycleObserver observer);

    @MainThread
    public abstract void removeObserver(@NonNull LifecycleObserver observer);

    @MainThread
    @NonNull
    public abstract State getCurrentState();

    @SuppressWarnings("WeakerAccess")
    public enum Event {
        /**
         * Constant for onCreate event of the {@link LifecycleOwner}.
         */
        ON_CREATE,
        /**
         * Constant for onStart event of the {@link LifecycleOwner}.
         */
        ON_START,
        /**
         * Constant for onResume event of the {@link LifecycleOwner}.
         */
        ON_RESUME,
        /**
         * Constant for onPause event of the {@link LifecycleOwner}.
         */
        ON_PAUSE,
        /**
         * Constant for onStop event of the {@link LifecycleOwner}.
         */
        ON_STOP,
        /**
         * Constant for onDestroy event of the {@link LifecycleOwner}.
         */
        ON_DESTROY,
        /**
         * An {@link Event Event} constant that can be used to match all events.
         */
        ON_ANY
    }

    /**
     * Lifecycle states. You can consider the states as the nodes in a graph and
     * {@link Event}s as the edges between these nodes.
     */
    @SuppressWarnings("WeakerAccess")
    public enum State {
        /**
         * Destroyed state for a LifecycleOwner. After this event, this Lifecycle will not dispatch
         * any more events. For instance, for an {@link android.app.Activity}, this state is reached
         * <b>right before</b> Activity's {@link android.app.Activity#onDestroy() onDestroy} call.
         */
        DESTROYED,

        /**
         * Initialized state for a LifecycleOwner. For an {@link android.app.Activity}, this is
         * the state when it is constructed but has not received
         * {@link android.app.Activity#onCreate(android.os.Bundle) onCreate} yet.
         */
        INITIALIZED,

        /**
         * Created state for a LifecycleOwner. For an {@link android.app.Activity}, this state
         * is reached in two cases:
         * <ul>
         *     <li>after {@link android.app.Activity#onCreate(android.os.Bundle) onCreate} call;
         *     <li><b>right before</b> {@link android.app.Activity#onStop() onStop} call.
         * </ul>
         */
        CREATED,

        /**
         * Started state for a LifecycleOwner. For an {@link android.app.Activity}, this state
         * is reached in two cases:
         * <ul>
         *     <li>after {@link android.app.Activity#onStart() onStart} call;
         *     <li><b>right before</b> {@link android.app.Activity#onPause() onPause} call.
         * </ul>
         */
        STARTED,

        /**
         * Resumed state for a LifecycleOwner. For an {@link android.app.Activity}, this state
         * is reached after {@link android.app.Activity#onResume() onResume} is called.
         */
        RESUMED;

        /**
         * Compares if this State is greater or equal to the given {@code state}.
         *
         * @param state State to compare with
         * @return true if this State is greater or equal to the given {@code state}
         */
        public boolean isAtLeast(@NonNull State state) {return compareTo(state) >= 0;
        }
    }
}

咱们来看看 Lifecycle 实现类 LifecycleRegistry,

次要看增加观察者以及接管被观察者, 对应如下两个办法

@Override
    public void addObserver(@NonNull LifecycleObserver observer) {
        State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
        ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
        ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);

        if (previous != null) {return;}
        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
        if (lifecycleOwner == null) {
            // it is null we should be destroyed. Fallback quickly
            return;
        }

        boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
        State targetState = calculateTargetState(observer);
        mAddingObserverCounter++;
        while ((statefulObserver.mState.compareTo(targetState) < 0
                && mObserverMap.contains(observer))) {pushParentState(statefulObserver.mState);
            statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
            popParentState();
            // mState / subling may have been changed recalculate
            targetState = calculateTargetState(observer);
        }

        if (!isReentrance) {
            // we do sync only on the top level.
            sync();}
        mAddingObserverCounter--;
    }

public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {State next = getStateAfter(event);
        moveToState(next);
    }

接着看看 ObserverWithState 带状态的 Observe 做了什么,

static class ObserverWithState {
        State mState;
        GenericLifecycleObserver mLifecycleObserver;

        ObserverWithState(LifecycleObserver observer, State initialState) {mLifecycleObserver = Lifecycling.getCallback(observer);
            mState = initialState;
        }

        void dispatchEvent(LifecycleOwner owner, Event event) {State newState = getStateAfter(event);
            mState = min(mState, newState);
            mLifecycleObserver.onStateChanged(owner, event);
            mState = newState;
        }
    }

次要是 Lifecycling.getCallback(observer) 获取 GenericLifecycleObserver, 在 dispatchEvent 执行 onStateChanged() 告诉数据更新, 而 dispatchEvent 办法在 addObserver 中执行

statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));

所以当 liveData 中执行 observe 时

  @MainThread
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {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);
    }

首先会创立 LifecycleBoundObserver, 来看看 LifecycleBoundObserver 代码

class LifecycleBoundObserver extends ObserverWrapper implements GenericLifecycleObserver {
        @NonNull final LifecycleOwner mOwner;

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

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

        @Override
        public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {removeObserver(mObserver);
                return;
            }
            activeStateChanged(shouldBeActive());
        }

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

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

LifecycleBoundObserver 实现了 GenericLifecycleObserver, 并实现 onStateChanged 办法

接着 owner.getLifecycle().addObserver(wrapper), 获取 Lifecycle, 调用到下面解析的 addObserver, 而这里的 wrapper 为 GenericLifecycleObserver, 那么 Lifecycling.getCallback(observe) 间接取到 GenericLifecycleObserver, 则执行 addObserver 中 dispatchEvent, 即调用到 onStateChanged, 此时 LifecycleBoundObserver 中 onStateChanged

if (mOwner.getLifecycle().getCurrentState() == DESTROYED) 此判断解决内存透露问题

@Override
        public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {removeObserver(mObserver);
                return;
            }
            activeStateChanged(shouldBeActive());
        }

接着执行如下, 次要看 dispatchingValue

  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;
            if (wasInactive && mActive) {onActive();
            }
            if (LiveData.this.mActiveCount == 0 && !mActive) {onInactive();
            }
            if (mActive) {dispatchingValue(this);
            }
        }
 private 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<T>, ObserverWrapper>> iterator =
                        mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {considerNotify(iterator.next().getValue());
                    if (mDispatchInvalidated) {break;}
                }
            }
        } while (mDispatchInvalidated);
        mDispatchingValue = false;
    }

这里次要看 considerNotify,initiator 不为 null, 间接调用

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;
        //noinspection unchecked
        observer.mObserver.onChanged((T) mData);
    }

最终执行到 observer 的 onChanged, 即 public void observe(@NonNull LifecycleOwner owner, @NonNull Observer observer) 中 Observer 的 onChanged

推展:setValue,postValue 之后 observer 获取到数据更新

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

private 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<T>, ObserverWrapper>> iterator =
                        mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {considerNotify(iterator.next().getValue());
                    if (mDispatchInvalidated) {break;}
                }
            }
        } while (mDispatchInvalidated);
        mDispatchingValue = false;
    }

同上逻辑, 只是 dispatchingValue(null); 会遍历所有 Observer, 调用 considerNotify

 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);
        }
    };

而 postValue 只是 post 到主线程, 执行 setValue

二.LiveData 绑定 activity 申明周期

次要看 LifecycleDispatcher 这个类

 static void init(Context context) {if (sInitialized.getAndSet(true)) {return;}
        ((Application) context.getApplicationContext())
                .registerActivityLifecycleCallbacks(new DispatcherActivityCallback());
    }

    @SuppressWarnings("WeakerAccess")
    @VisibleForTesting
    static class DispatcherActivityCallback extends EmptyActivityLifecycleCallbacks {
        private final FragmentCallback mFragmentCallback;

        DispatcherActivityCallback() {mFragmentCallback = new FragmentCallback();
        }

        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {if (activity instanceof FragmentActivity) {((FragmentActivity) activity).getSupportFragmentManager()
                        .registerFragmentLifecycleCallbacks(mFragmentCallback, true);
            }
            ReportFragment.injectIfNeededIn(activity);
        }

init 初始化之后, 在 DispatcherActivityCallback 中 ReportFragment.injectIfNeededIn(activity); 将 activity 注入到了 ReportFragment, 接着看 ReportFragment

@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class ReportFragment extends Fragment {
    private static final String REPORT_FRAGMENT_TAG = "android.arch.lifecycle"
            + ".LifecycleDispatcher.report_fragment_tag";

    public static void injectIfNeededIn(Activity activity) {
        // ProcessLifecycleOwner should always correctly work and some activities may not extend
        // FragmentActivity from support lib, so we use framework fragments for activities
        android.app.FragmentManager manager = activity.getFragmentManager();
        if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
            // Hopefully, we are the first to make a transaction.
            manager.executePendingTransactions();}
    }

    static ReportFragment get(Activity activity) {return (ReportFragment) activity.getFragmentManager().findFragmentByTag(REPORT_FRAGMENT_TAG);
    }

    private ActivityInitializationListener mProcessListener;

    private void dispatchCreate(ActivityInitializationListener listener) {if (listener != null) {listener.onCreate();
        }
    }

    private void dispatchStart(ActivityInitializationListener listener) {if (listener != null) {listener.onStart();
        }
    }

    private void dispatchResume(ActivityInitializationListener listener) {if (listener != null) {listener.onResume();
        }
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);
        dispatchCreate(mProcessListener);
        dispatch(Lifecycle.Event.ON_CREATE);
    }

    @Override
    public void onStart() {super.onStart();
        dispatchStart(mProcessListener);
        dispatch(Lifecycle.Event.ON_START);
    }

    @Override
    public void onResume() {super.onResume();
        dispatchResume(mProcessListener);
        dispatch(Lifecycle.Event.ON_RESUME);
    }

    @Override
    public void onPause() {super.onPause();
        dispatch(Lifecycle.Event.ON_PAUSE);
    }

    @Override
    public void onStop() {super.onStop();
        dispatch(Lifecycle.Event.ON_STOP);
    }

    @Override
    public void onDestroy() {super.onDestroy();
        dispatch(Lifecycle.Event.ON_DESTROY);
        // just want to be sure that we won't leak reference to an activity
        mProcessListener = null;
    }

    private void dispatch(Lifecycle.Event event) {Activity activity = getActivity();
        if (activity instanceof LifecycleRegistryOwner) {((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
            return;
        }

        if (activity instanceof LifecycleOwner) {Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
            if (lifecycle instanceof LifecycleRegistry) {((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
            }
        }
    }

    void setProcessListener(ActivityInitializationListener processListener) {mProcessListener = processListener;}

    interface ActivityInitializationListener {void onCreate();

        void onStart();

        void onResume();}
}

通过 injectIfNeededIn 办法创立了 ReportFragment, 通过治理 ReportFragment 的申明周期,dispatch(Lifecycle.Event.ON\_PAUSE); 将申明周期枚举进行散发

private void dispatch(Lifecycle.Event event) {Activity activity = getActivity();
        if (activity instanceof LifecycleRegistryOwner) {((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
            return;
        }

        if (activity instanceof LifecycleOwner) {Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
            if (lifecycle instanceof LifecycleRegistry) {((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
            }
        }
    }

最初 event 赋值给了 LifecycleRegistry 中 mState, 并通过 getCurrentState 获取

则 Lifecycle 通过 getCurrentState() 能够取到以后 activity 的申明周期了

看看为什么不会导致内存透露

 @MainThread
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {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);
    }
@Override
        public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {removeObserver(mObserver);
                return;
            }
            activeStateChanged(shouldBeActive());
        }

当执行 observe 和 onStateChanged 都有判断以后 activity 是否 destroyed, 由此可见,activity 销毁了, 并不会执行数据更新, 天然不会有内存透露

三.viewModel 如何实现数据共享

次要是同一个 HolderFragment, 导致有同一个 ViewModelStore, 同一个 ViewModelStore 存的 key 是同一个, 所以 get 获取到的 viewModel 是同一个, 数据天然能共享, 咱们来一步步解析

class ViewModelDelegate<out T : BaseViewModel>(private val clazz: KClass<T>, private val fromActivity: Boolean) {

    private var viewModel: T? = null

    operator fun getValue(thisRef: BaseActivity, property: KProperty<*>) = buildViewModel(activity = thisRef)

    operator fun getValue(thisRef: BaseFragment, property: KProperty<*>) = if (fromActivity)
        buildViewModel(activity = thisRef.activity as? BaseActivity
                ?: throw IllegalStateException("Activity must be as BaseActivity"))
    else buildViewModel(fragment = thisRef)

    private fun buildViewModel(activity: BaseActivity? = null, fragment: BaseFragment? = null): T {if (viewModel != null) return viewModel!!

        activity?.let {viewModel = ViewModelProviders.of(it).get(clazz.java)
        } ?: fragment?.let {viewModel = ViewModelProviders.of(it).get(clazz.java)
        } ?: throw IllegalStateException("Activity and Fragment null! =(")

        return viewModel!!
    }
}

fun <T : BaseViewModel> BaseActivity.viewModelDelegate(clazz: KClass<T>) = ViewModelDelegate(clazz, true)

// fromActivity 默认为 true,viewModel 生命周期默认跟 activity 雷同 by aaron 2018/7/24
fun <T : BaseViewModel> BaseFragment.viewModelDelegate(clazz: KClass<T>, fromActivity: Boolean = true) = ViewModelDelegate(clazz, fromActivity)

这是通过代理生成的 viewModel, 咱们来看 ViewModelProviders.of(it).get(clazz.java) 外面做了一些什么

@NonNull
    @MainThread
    public static ViewModelProvider of(@NonNull FragmentActivity activity) {return of(activity, null);
    }

 @NonNull
    @MainThread
    public static ViewModelProvider of(@NonNull FragmentActivity activity,
            @Nullable Factory factory) {Application application = checkApplication(activity);
        if (factory == null) {factory = ViewModelProvider.AndroidViewModelFactory.getInstance(application);
        }
        return new ViewModelProvider(ViewModelStores.of(activity), factory);
    }

如上, 首先默认传入 Factory 为 null, 会通过 ViewModelProvider.AndroidViewModelFactory.getInstance(application); 去获取单例的 factory, 接着看 ViewModelStores.of(activity)

 @NonNull
    @MainThread
    public static ViewModelStore of(@NonNull FragmentActivity activity) {if (activity instanceof ViewModelStoreOwner) {return ((ViewModelStoreOwner) activity).getViewModelStore();}
        return holderFragmentFor(activity).getViewModelStore();}

if (activity instanceof ViewModelStoreOwner) 并不会执行, 那么走 holderFragmentFor(activity).getViewModelStore(); holderFragmentFor(activity) 如下, 是获取 HolderFragment

@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
    public static HolderFragment holderFragmentFor(FragmentActivity activity) {return sHolderFragmentManager.holderFragmentFor(activity);
    }

sHolderFragmentManager 是动态外部类 HolderFragmentManager, 而 HolderFragmentManager 是饿汉式创立的单例

private static final HolderFragmentManager sHolderFragmentManager = new HolderFragmentManager();

接着往下看

HolderFragment holderFragmentFor(FragmentActivity activity) {FragmentManager fm = activity.getSupportFragmentManager();
            HolderFragment holder = findHolderFragment(fm);
            if (holder != null) {return holder;}
            holder = mNotCommittedActivityHolders.get(activity);
            if (holder != null) {return holder;}

            if (!mActivityCallbacksIsAdded) {
                mActivityCallbacksIsAdded = true;
                activity.getApplication().registerActivityLifecycleCallbacks(mActivityCallbacks);
            }
            holder = createHolderFragment(fm);
            mNotCommittedActivityHolders.put(activity, holder);
            return holder;
        }

首先是 findHolderFragment(fm), 在 activity 的 supportFragmentManager 中查找, 如下, 通过同一个 tag 获取到 HolderFragment,

如果 HolderFragment 不为空间接返回, 如果为空通过 mNotCommittedActivityHolders.get(activity), 如果 HolderFragment 为空, 通过 createHolderFragment() 创立 ,tag 为 HOLDER\_TAG, 并办法 mNotCommittedActivityHolders 的 map 中 由此可见 findHolderFragment,mNotCommittedActivityHolders.get(activity), 在多个 activity 中获取的 HolderFragment 可能是同一个

  private static HolderFragment createHolderFragment(FragmentManager fragmentManager) {HolderFragment holder = new HolderFragment();
            fragmentManager.beginTransaction().add(holder, HOLDER_TAG).commitAllowingStateLoss();
            return holder;
        }
private static HolderFragment findHolderFragment(FragmentManager manager) {if (manager.isDestroyed()) {throw new IllegalStateException("Can't access ViewModels from onDestroy");
            }

            Fragment fragmentByTag = manager.findFragmentByTag(HOLDER_TAG);
            if (fragmentByTag != null && !(fragmentByTag instanceof HolderFragment)) {
                throw new IllegalStateException("Unexpected"
                        + "fragment instance was returned by HOLDER_TAG");
            }
            return (HolderFragment) fragmentByTag;
        }

再回到下面 holderFragmentFor(activity).getViewModelStore(), 看 getViewModelStore() 办法

private ViewModelStore mViewModelStore = new ViewModelStore();

@NonNull
    @Override
    public ViewModelStore getViewModelStore() {return mViewModelStore;}

在 HolderFragment 中创立的 ViewModelStore, 则为同一个 ViewModelStore

最初再看 ViewModelProviders.of(it).get(clazz.java) 中 get 办法

public <T extends ViewModel> T get(@NonNull Class<T> modelClass) {String canonicalName = modelClass.getCanonicalName();
        if (canonicalName == null) {throw new IllegalArgumentException("Local and anonymous classes can not be ViewModels");
        }
        return get(DEFAULT_KEY + ":" + canonicalName, modelClass);
    }
@NonNull
    @MainThread
    public <T extends ViewModel> T get(@NonNull String key, @NonNull Class<T> modelClass) {ViewModel viewModel = mViewModelStore.get(key);

        if (modelClass.isInstance(viewModel)) {
            //noinspection unchecked
            return (T) viewModel;
        } else {
            //noinspection StatementWithEmptyBody
            if (viewModel != null) {// TODO: log a warning.}
        }

        viewModel = mFactory.create(modelClass);
        mViewModelStore.put(key, viewModel);
        //noinspection unchecked
        return (T) viewModel;
    }

次要看 ViewModel viewModel = mViewModelStore.get(key);viewmodel 的获取是通过 mViewModelStore 取到

 @NonNull
    @MainThread
    public static ViewModelProvider of(@NonNull FragmentActivity activity,
            @Nullable Factory factory) {Application application = checkApplication(activity);
        if (factory == null) {factory = ViewModelProvider.AndroidViewModelFactory.getInstance(application);
        }
        return new ViewModelProvider(ViewModelStores.of(activity), factory);
    }
 public ViewModelProvider(@NonNull ViewModelStore store, @NonNull Factory factory) {
        mFactory = factory;
        this.mViewModelStore = store;
    }

首先是咱们从 mViewModelStore 取出咱们想要的 ViewModel.

有的话就返回 而 mViewModelStore 是通过 ViewModelStores.of(activity) 取到的以后 activity 中的同一个 mViewModelStore 通过 key, 则获取了咱们想要的 viewModel

没有的话就利用工厂模式反射生产咱们所要的 ViewModel 对象,同时把咱们的 ViewModel 对象放入 mViewModelStore。同时返回咱们的 ViewModel.

由此可见, 同一个 activity 中获取的对应的 viewmodel 是同一个, 那么 fragment 中 viewmodel 数据天然能共享

四.viewModel 实现数据保留

次要是横屏竖屏下,activity 会重启, 数据会从新获取, 应用 viewModel 时,viewModel 是存在 HoldFragment 中的 ViewModelStore 中

public HolderFragment() {setRetainInstance(true);
    }

可见 HolderFragment 调用 setsetRetainInstance(true), 使得 HolderFragment 在 FragmentMannager 调用 FindFragmentBytag, 找到的是同一个 HolderFragment 对象(无论 Activity 是否重绘),这也保障了 HolderFragment 中的 ViewModelStore(寄存咱们 ViewModel 的中央)不被销毁,而后咱们取出咱们所要的 ViewModel, 进行数据读取

相干教程

Android 根底系列教程:
Android 根底课程 U - 小结_哔哩哔哩_bilibili
Android 根底课程 UI- 布局_哔哩哔哩_bilibili
Android 根底课程 UI- 控件_哔哩哔哩_bilibili
Android 根底课程 UI- 动画_哔哩哔哩_bilibili
Android 根底课程 -activity 的应用_哔哩哔哩_bilibili
Android 根底课程 -Fragment 应用办法_哔哩哔哩_bilibili
Android 根底课程 - 热修复 / 热更新技术原理_哔哩哔哩_bilibili

本文转自 https://juejin.cn/post/7041098418499878949,如有侵权,请分割删除。

退出移动版