一 入口
阅读源码需要从源码的入口处着手, 先看先官方的例子 (https://developer.android.com/topic/libraries/architecture/livedata):
- ViewModel
- public class NameViewModel extends ViewModel {
- // Create a LiveData with a String
- private MutableLiveData<String> mCurrentName;
- public MutableLiveData<String> getCurrentName() {
- if (mCurrentName == null) {
- mCurrentName = new MutableLiveData<String>();
- }
- return mCurrentName;
- }
- ...
- }
里面有一个 LiveData 数据和 getLivedata 方法
二 使用:
- public class NameActivity extends AppCompatActivity {
- private NameViewModel mModel;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // Other code to setup the activity...
- // Get the ViewModel.
- mModel = ViewModelProviders.of(this).get(NameViewModel.class);
- // Create the observer which updates the UI.
- final Observer<String> nameObserver = new Observer<String>() {
- @Override
- public void onChanged(@Nullable final String newName) {
- // Update the UI, in this case, a TextView.
- mNameTextView.setText(newName);
- }
- };
- // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
- mModel.getCurrentName().observe(this, nameObserver);
- }
- }
更新 LiveData:
- mButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- String anotherName = "John Doe";
- mModel.getCurrentName().setValue(anotherName);
- }
- });
mModel.getCurrentName().observe(this, nameObserver) 就是注册了观察者, 接上一篇.
三 LiveData 是如何工作的?
- 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);
- ...
- owner.getLifecycle().addObserver(wrapper);
- }
DESTROYED 状态就不进行注册操作. 否则 addObserver(wrapper).
在什么时候回调 Observer 的 void onChanged(@Nullable T t) 呢?
有两个地方会回调:
LifecycleBoundObserver 的 onStateChanged 处
LiveData void setValue(T value) 和 void postValue(T value) 内部调用 setValue.
下面分开看.
在上一篇中, 我们知道, lifeCircle 感知到生命周期时, 进行对应的回调给 Observer, 即回调这里的 LifecycleBoundObserver 的 onStateChanged 方法.
- @Override
- public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
- if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
- removeObserver(mObserver);
- return;
- }
- activeStateChanged(shouldBeActive());
- }
- 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);
- }
- }
在 wasInactive && mActive 调用了 LiveData 的 onActive(), 在这里我们可以释放资源. onInactive() 相反. 最后, 如果是在 mActive 为 true 情况下, 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;
- }
分两种情况:
1 initiator 为 null, 就 considerNotify 所有的 Observer.
否则, 就 considerNotify(initiator);
- 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);
- }
调用 onChanged 方法. 即回调到 google 示例的方法:
- final Observer<String> nameObserver = new Observer<String>() {
- @Override
- public void onChanged(@Nullable final String newName) {
- // Update the UI, in this case, a TextView.
- mNameTextView.setText(newName);
- }
- };
然后, 我们 setValue 处的回调.
- protected void setValue(T value) {
- assertMainThread("setValue");
- mVersion++;
- mData = value;
- dispatchingValue(null);
- }
dispatchingValue(null) 由上面可见, 会调用所有 Observer 的 onChanged 方法. post 方法省略. google 的例子就是通过 setValue 方法更新 LiveData 的数据的. LiveData 的源码就阅读完了.
四 ViewModel 的创建
mModel = ViewModelProviders.of(this).get(NameViewModel.class)
代码比较少, 我们来看看.
of 的参数主要是两种 activity, fragment. 最终走如下两个分支
- public static ViewModelProvider of(@NonNull Fragment fragment, @Nullable Factory factory) {
- Application application = checkApplication(checkActivity(fragment));
- if (factory == null) {
- factory = ViewModelProvider.AndroidViewModelFactory.getInstance(application);
- }
- return new ViewModelProvider(ViewModelStores.of(fragment), factory);
- }
- 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);
- }
可以看出都是新建 ViewModelProvider, 参数为 @NonNull ViewModelStore store, @NonNull Factory factory
分别看, 第二个参数两个方法是类似的, 不同的是第一个参数. ViewModelStore 的 of 重载方法.
- public static ViewModelStore of(@NonNull FragmentActivity activity) {
- if (activity instanceof ViewModelStoreOwner) {
- return ((ViewModelStoreOwner) activity).getViewModelStore();
- }
- return holderFragmentFor(activity).getViewModelStore();
- }
- public static ViewModelStore of(@NonNull Fragment fragment) {
- if (fragment instanceof ViewModelStoreOwner) {
- return ((ViewModelStoreOwner) fragment).getViewModelStore();
- }
- return holderFragmentFor(fragment).getViewModelStore();
- }
看到这里, 其实可以猜到, 也是采用的透明的 fragment 存储 viewModel. 继续跟进去:
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
- public static HolderFragment holderFragmentFor(FragmentActivity activity) {
- return sHolderFragmentManager.holderFragmentFor(activity);
- }
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
- public static HolderFragment holderFragmentFor(Fragment fragment) {
- return sHolderFragmentManager.holderFragmentFor(fragment);
- }
- 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;
- }
- HolderFragment holderFragmentFor(Fragment parentFragment) {
- FragmentManager fm = parentFragment.getChildFragmentManager();
- HolderFragment holder = findHolderFragment(fm);
- if (holder != null) {
- return holder;
- }
- holder = mNotCommittedFragmentHolders.get(parentFragment);
- if (holder != null) {
- return holder;
- }
- parentFragment.getFragmentManager()
- .registerFragmentLifecycleCallbacks(mParentDestroyedCallback, false);
- holder = createHolderFragment(fm);
- mNotCommittedFragmentHolders.put(parentFragment, holder);
- return holder;
- }
即不存在时, 都通过 createHolderFragment(fm) 创建对应 holder, 不过生命周期不同而已.
- 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;
- }
作了一份内存级缓存.
image.png
整个架构如图, 这里看出, ViewModel 持有 activity 或 fragment, 需要注意的就是内存泄漏, 记得在适当时机调用 onCleared() 方法.
来源: http://www.jianshu.com/p/70db60c03bb7