liveData = new MutableLiveData<>();
liveData.observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable final String newText) {
// 更新数据
tv3.setText(newText);
}
});
liveData.setValue("小杨真的是一个逗比么");
复制代码
public class TextViewModel extends ViewModel {
/**
* LiveData是抽象类,MutableLiveData是具体实现类
*/
private MutableLiveData<String> mCurrentText;
public MutableLiveData<String> getCurrentText() {
if (mCurrentText == null) {
mCurrentText = new MutableLiveData<>();
}
return mCurrentText;
}
}
复制代码
private void initLiveData() {
// 建立一个持有某种数据类型的LiveData (一般是在ViewModel中)
model = ViewModelProviders.of(this).get(TextViewModel.class);
// 建立一个定义了onChange()方法的观察者
// 开始订阅
final Observer<String> nameObserver = new Observer<String>() {
@Override
public void onChanged(@Nullable final String newText) {
// 更新数据
tvText.setText(newText);
}
};
// 经过 observe()方法链接观察者和LiveData,注意:observe()方法须要携带一个LifecycleOwner类
model.getCurrentText().observe(this, nameObserver);
}
复制代码
findViewById(R.id.tv_click).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
count++;
String text;
switch (count%5){
case 1:
text = "小杨真的是一个逗比么";
break;
case 2:
text = "逗比赶忙来star吧";
break;
case 3:
text = "小杨想成为大神";
break;
case 4:
text = "开始刷新数据啦";
break;
default:
text = "变化成默认的数据";
break;
}
model.getCurrentText().setValue(text);
}
});
复制代码
@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
//当前绑定的组件(activity或者fragment)状态为DESTROYED的时候, 则会忽视当前的订阅请求
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// ignore
return;
}
//建立生命周期感知的观察者包装类
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
//若是指定的键还没有与某个值关联,则将其与给定的值关联
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
//对应观察者只能与一个owner绑定
if (existing != null && !existing.isAttachedTo(owner)) {
throw new IllegalArgumentException("Cannot add the same observer"
+ " with different lifecycles");
}
if (existing != null) {
return;
}
//lifecycle注册
//添加一个LifecycleObserver,它将在LifecycleOwner更改状态时获得通知
owner.getLifecycle().addObserver(wrapper);
}
复制代码
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) {
// 当接收到 DESTROYED 的事件会自动解除跟 owner 的绑定
removeObserver(mObserver);
return;
}
activeStateChanged(shouldBeActive());
}
@Override
boolean isAttachedTo(LifecycleOwner owner) {
return mOwner == owner;
}
@Override
void detachObserver() {
mOwner.getLifecycle().removeObserver(this);
}
}
//抽象类
private abstract class ObserverWrapper {
final Observer<T> mObserver;
boolean mActive;
int mLastVersion = START_VERSION;
ObserverWrapper(Observer<T> observer) {
mObserver = observer;
}
abstract boolean shouldBeActive();
boolean isAttachedTo(LifecycleOwner owner) {
return false;
}
void detachObserver() {
}
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); } } } //接口 public interface GenericLifecycleObserver extends LifecycleObserver { /** * Called when a state transition event happens. * * @param source The source of the event * @param event The event */ void onStateChanged(LifecycleOwner source, Lifecycle.Event event); } 复制代码
if (wasInactive && mActive) {
onActive();
}
if (LiveData.this.mActiveCount == 0 && !mActive) {
onInactive();
}
复制代码
//mObservers是一个集合
private SafeIterableMap<Observer<T>, ObserverWrapper> mObservers =
new SafeIterableMap<>();
//在SafeIterableMap类中的putIfAbsent方法
public V putIfAbsent(@NonNull K key, @NonNull V v) {
Entry<K, V> entry = get(key);
if (entry != null) {
return entry.mValue;
}
put(key, v);
return null;
}
protected Entry<K, V> put(@NonNull K key, @NonNull V v) {
Entry<K, V> newEntry = new Entry<>(key, v);
mSize++;
if (mEnd == null) {
mStart = newEntry;
mEnd = mStart;
return newEntry;
}
mEnd.mNext = newEntry;
newEntry.mPrevious = mEnd;
mEnd = newEntry;
return newEntry;
}
复制代码
@MainThread
protected void setValue(T value) {
assertMainThread("setValue");
// 这里的 mVersion,它本问题关键,每次更新数据都会自增,默认值是 -1。
mVersion++;
mData = value;
dispatchingValue(null);
}
复制代码
private void dispatchingValue(@Nullable ObserverWrapper initiator) {
// mDispatchingValue的判断主要是为了解决并发调用dispatchingValue的状况
// 当对应数据的观察者在执行的过程当中, 若有新的数据变动, 则不会再次通知到观察者。因此观察者内的执行不该进行耗时工做
if (mDispatchingValue) {
//给分发失败打个标记
mDispatchInvalidated = true;
return;
}
// 标记分发开始
mDispatchingValue = true;
do {
mDispatchInvalidated = false;
//这里须要注意:区分ObserverWrapper对象为空,和不为空的逻辑是不同的
if (initiator != null) {
// 等下重点看这里的代码
considerNotify(initiator);
initiator = null;
} else {
//能够发现这里用到mObservers集合,使用迭代器遍历数据
for (Iterator<Map.Entry<Observer<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;
}
// 检查最新的状态b4调度。也许它改变了状态,但咱们尚未获得事件。
// 咱们仍是先检查观察者。活动,以保持它做为活动的入口。
// 所以,即便观察者移动到一个活动状态,若是咱们没有收到那个事件,咱们最好不要通知一个更可预测的通知顺序。
if (!observer.shouldBeActive()) {
observer.activeStateChanged(false);
return;
}
//注意认真看下面的代码
if (observer.mLastVersion >= mVersion) {
return;
}
observer.mLastVersion = mVersion;
//noinspection unchecked
observer.mObserver.onChanged((T) mData);
}
复制代码
private abstract class ObserverWrapper {
final Observer<T> mObserver;
boolean mActive;
int mLastVersion = START_VERSION;
//省略部分代码
void activeStateChanged(boolean newActive) {
if (newActive == mActive) {
return;
}
// 当observer的状态从active->inactive, 或者inactive->active的时候走如下流程
// 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();
}
//当observer是从inactive->active的时候,须要通知到观察者
if (mActive) {
dispatchingValue(this);
}
}
}
复制代码
@MainThread
public void observeForever(@NonNull Observer<T> observer) {
// 建立一个AlwaysActiveObserver对象
AlwaysActiveObserver wrapper = new AlwaysActiveObserver(observer);
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
if (existing != null && existing instanceof LiveData.LifecycleBoundObserver) {
throw new IllegalArgumentException("Cannot add the same observer"
+ " with different lifecycles");
}
if (existing != null) {
return;
}
//刷新数据
wrapper.activeStateChanged(true);
}
复制代码