Android官方架構元件之LiveData + ViewModel + Room 原始碼分析一
簡單使用案例:
MainActivity:
viewModel.getMessageObserver().observe(this, new Observer<MessageBean>() {
@Override
public void onChanged(@Nullable MessageBean messageBean) {
if (messageBean != null) {
LogUtils.d(messageBean.toString());
}
}
});
MessageViewModel:
public class MessageViewModel extends ViewModel {
private final MutableLiveData<MessageBean> mMessageObserver = new MutableLiveData<>();
public LiveData<MessageBean> getMessageObserver() {
return mMessageObserver ;
}
public void setHoroscopeId(int horoscopeId) {
List<MessageBean> characters = new ArrayList<>();
characters.add(new MessageBean("body1"));
characters.add(new MessageBean("body2"));
characters.add(new MessageBean("body3"));
characters.add(new MessageBean("body4"));
mMessageObserver.setValue(characters.get(horoscopeId));
}
public void getProjectList() {
DataRepository.getInstance().getProjectList(mMessageObserver , "1", 294);
}
}
其中viewModel.getMessageObserver().observe(this, new Observer() )
中的this即SupportActivity :LifecycleOwner
SupportActivity implements LifecycleOwner
public interface LifecycleOwner {
Lifecycle getLifecycle();
}
SupportActivity
public class SupportActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ReportFragment.injectIfNeededIn(this);
}
@CallSuper
@Override
protected void onSaveInstanceState(Bundle outState) {
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
super.onSaveInstanceState(outState);
}
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
SupportActivity就是通過getLifecycle()獲取 mLifecycleRegistry來標記當前Activity或Fragment的各種狀態,其中ReportFragment.injectIfNeededIn(this)內部原始碼也是與mLifecycleRegistry.markState(Lifecycle.State.CREATED) 類似,狀態的資訊記錄在mLifecycleRegistry物件內部。Activity的其他型別的事件如onCreate,onPause等都是通過getLifecycle()獲取 mLifecycleRegistry物件呼叫mLifecycleRegistry內部方法來改變其狀態的。
Fragment的狀態更加容易看到,FragmentActivity即在Activity的生命週期中獲取
FragmentActivity部分原始碼:
@Override
protected void onStop() {
super.onStop();
mStopped = true;
markState(getSupportFragmentManager(), Lifecycle.State.CREATED);
mHandler.sendEmptyMessage(MSG_REALLY_STOPPED);
mFragments.dispatchStop();
}
private static void markState(FragmentManager manager, Lifecycle.State state) {
Collection<Fragment> fragments = manager.getFragments();
for (Fragment fragment : fragments) {
if (fragment == null) {
continue;
}
fragment.mLifecycleRegistry.markState(state);
markState(fragment.getChildFragmentManager(), state);
}
}
通過上面的簡單分析,兩個重要的類即 LifecycleRegistry extends Lifecycle:
下面是Lifecycle抽象類:
public abstract class Lifecycle {
@MainThread
public abstract void addObserver(@NonNull LifecycleObserver observer);
@MainThread
public abstract void removeObserver(@NonNull LifecycleObserver observer);
@MainThread
public abstract State getCurrentState();
public enum Event {
ON_CREATE,
ON_START,
ON_RESUME,
ON_PAUSE,
ON_STOP,
ON_DESTROY,
ON_ANY
}
public enum State {
DESTROYED,
INITIALIZED,
CREATED,
STARTED,
RESUMED;
public boolean isAtLeast(@NonNull State state) {
return compareTo(state) >= 0;
}
}
}
回到開始的案例:
LiveData.observe(this, new Observer);
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// ignore
return;
}
// 經典的裝飾器模式,這裡的設計很精妙,可以看出我們傳入的Observer和 owner.getLifecycle().addObserver()是不同的。
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
// 判斷是否已經新增過防止重複新增
LifecycleBoundObserver existing = mObservers.putIfAbsent(observer, wrapper);
if (existing != null && existing.owner != wrapper.owner) {
throw new IllegalArgumentException("Cannot add the same observer"
+ " with different lifecycles");
}
if (existing != null) {
return;
}
owner.getLifecycle().addObserver(wrapper);
}
這裡我們傳入的Observer和 owner.getLifecycle().addObserver()即 Activity中的Lifecycle 是不同的。
我們上面已經知道Activity中的Lifecycle是與生命週期相關的,通過Lifecycle.addObserver()可以監聽到 Activity的生命週期 然後在LifecycleBoundObserver作出
相應的處理,具體的實現在LifecycleRegistry.addObserver中(Lifecycle實現類),最終會根據事件變化呼叫 mLifecycleObserver.onStateChanged(owner, event),
class LifecycleBoundObserver implements GenericLifecycleObserver {
public final LifecycleOwner owner;
public final Observer<T> observer;
LifecycleBoundObserver(LifecycleOwner owner, Observer<T> observer) {
this.owner = owner;
this.observer = observer;
}
@Override
public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
// 此處在元件如Activity onDestroy的時候自動移除觀察者。
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
removeObserver(observer);
return;
}
// immediately set active state, so we'd never dispatch anything to inactive
// owner
activeStateChanged(isActiveState(owner.getLifecycle().getCurrentState()));
}
}
LifecycleBoundObserver.onStateChanged -> activeStateChanged -> dispatchingValue -> considerNotify(initiator) -> observer.observer.onChanged((T) mData);
最終呼叫的是我們傳入的observer。
這樣看來 LiveData<T> 就沒有什麼特殊的了,把它看做一個普通的觀察者模式的管理者即可,比如EventBus。
public abstract class LiveData<T> {
private static final Object NOT_SET = new Object();
// LiveData<T> 存取的值,即T, setValue,postValue 會強制轉換為T。
private volatile Object mData = NOT_SET;
}
https://developer.android.com/reference/android/arch/lifecycle/Lifecycle
相關文章
- Android 架構元件 - Lifycycle, LiveData, ViewModelAndroid架構元件LiveDataView
- Android 官方架構元件(二)——LiveDataAndroid架構元件LiveData
- Android 官方架構元件(三)——ViewModelAndroid架構元件View
- 改造 Android 官方架構元件 ViewModelAndroid架構元件View
- 剖析 Android 架構元件之 ViewModelAndroid架構元件View
- 初學 Android 架構元件之 ViewModelAndroid架構元件View
- LiveData + ViewModel + Room (Google 官文)+DemoLiveDataViewOOMGo
- Jetpack架構元件學習(2)——ViewModel和Livedata使用Jetpack架構元件ViewLiveData
- Android官方架構元件ViewModel:從前世今生到追本溯源Android架構元件View
- Android架構元件Room的使用Android架構元件OOM
- Android官方架構元件LiveData: 觀察者模式領域二三事Android架構元件LiveData模式
- Android 官方架構元件之 LifecycleAndroid架構元件
- Android 官方架構元件(一)——LifecycleAndroid架構元件
- Room是怎樣和LiveData結合使用的?(原始碼分析)OOMLiveData原始碼
- Android Jetpack元件 - ViewModel,LiveData使用以及原理AndroidJetpack元件ViewLiveData
- Android Jetpack系列——ViewModel原始碼分析AndroidJetpackView原始碼
- ViewModel 原始碼分析View原始碼
- Android官方架構元件Lifecycle:生命週期元件詳解&原理分析Android架構元件
- 【翻譯】安卓架構元件(5)-ViewModel安卓架構元件View
- Android原始碼解析-LiveDataAndroid原始碼LiveData
- Android Jetpack元件之資料庫Room詳解(一)AndroidJetpack元件資料庫OOM
- Android模組開發框架 LiveData+ViewModelAndroid框架LiveDataView
- 【AAC 系列三】深入理解架構元件:LiveData架構元件LiveData
- Android 原始碼分析之 AsyncTask 原始碼分析Android原始碼
- 【AAC 系列四】深入理解架構元件:ViewModel架構元件View
- OkHttp 3.7原始碼分析(一)——整體架構HTTP原始碼架構
- LiveData && ViewModel使用詳解LiveDataView
- Jetpack的ViewModel與LiveDataJetpackViewLiveData
- Android官方架構元件Navigation:大巧不工的Fragment管理框架Android架構元件NavigationFragment框架
- Android Jetpack 架構元件之 NavigationAndroidJetpack架構元件Navigation
- Android Jetpack架構元件(七)之WorkManagerAndroidJetpack架構元件
- Android平臺架構的介紹和原始碼分析Android架構原始碼
- MongoDB原始碼分析之Command體系架構CJMongoDB原始碼架構
- ViewModel 基礎使用和原始碼分析View原始碼
- 多個Fragment如何共享一個ViewModel/LiveDataFragmentViewLiveData
- Flutter之Android層面原始碼分析(一)FlutterAndroid原始碼
- Android 原始碼結構分析Android原始碼
- thrift原始碼分析-架構設計原始碼架構