observer观察者

71 阅读1分钟
@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);
    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);
}

在上述代码中,Observer<? super T> observer 中的 observer 是一个泛型参数,表示观察者对象。这里使用了通配符 <? super T>,表示可以接受 T 类型及其父类型的观察者。 让我来解释一下:

  1. 泛型 T
    • 泛型 T 表示观察者所观察的数据类型。在 Observer<? super T> 中,T 是一个占位符,具体类型由观察者在使用时指定。
  2. Observer<? super T> observer
    • Observer 是 LiveData 中的观察者接口,用于观察数据的变化。这里使用了通配符 <? super T>,表示可以接受 T 类型及其父类型的观察者。
    • 使用通配符的目的是为了提高灵活性,使得观察者可以处理更广泛的数据类型。
  3. 类型参数 <? super T>
    • <? super T> 表示可以接受 T 类型及其父类型的观察者。这种设计允许传入的观察者处理比 T 更通用的数据类型。 总体而言,使用通配符 <? super T> 是为了在观察者中处理更广泛范围的数据类型,增强代码的灵活性。