Skip to content

Instantly share code, notes, and snippets.

@shiyifan
Last active April 30, 2019 10:35
Show Gist options
  • Save shiyifan/2f38c123627c96179f333633b4531957 to your computer and use it in GitHub Desktop.
Save shiyifan/2f38c123627c96179f333633b4531957 to your computer and use it in GitHub Desktop.
LiveData中调用observe需要注意的事情
@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);
/*
* mObservers是一个map,key是Observer, value是ObserverWrapper,用来存放所有该LiveData对象的观察者。
* 下面这个putIfAbsent调用的实现如函数名称所述,当在map的key中查询到observer
* 这个key对应的wrapper这个value时,返回map中已存在的wrapper,如果map中没有
* 这个key,那么就put进去,并返回null。
* Java中每个匿名类和lambda表达式在运行时的实例都是不同的,即使实现过程相同。所以多次对putIfAbsent传入相同实现的匿名类或者lambda的
* Observer会导致重复添加相同的实现。当LiveData的数据发生变动时,会触发多次相同的执行过程。
* 当观察LiveData的对象为Inactive状态时,Observer不会接收到数据变动事件,但也不会从LiveData中删除
* 因此,当在Activity或者Fragment中的生命周期回调函数中注册观察者时需要注意这一点。
* 可以通过声明一个类实例成员存放Observer的对象引用。然后每次observe该引用。这样就保证每次传入的observer的
* 实例是相同的,map中不会存储相同的实现并触发多次相同的执行过程。
*/
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);
}
@shiyifan
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment