Last active
April 30, 2019 10:35
-
-
Save shiyifan/2f38c123627c96179f333633b4531957 to your computer and use it in GitHub Desktop.
LiveData中调用observe需要注意的事情
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
唉