DisposableObserver
предназначен для подписки только один раз javadoc .Когда вы заглянете под капот DisposableObserver, вы увидите AtomicReference upstream
, который сохраняет текущий доступный ресурс при подписке наблюдателя.
public abstract class DisposableObserver<T> implements Observer<T>, Disposable {
final AtomicReference<Disposable> upstream = new AtomicReference<Disposable>();
@Override
public final void onSubscribe(@NonNull Disposable d) {
if (EndConsumerHelper.setOnce(this.upstream, d, getClass())) {
onStart();
}
}
// rest of code
EndConsumerHelper.setOnce
убедитесь, что DisposableObserver подписался только один раз.Если upstream
был удален, то другие upstream
не могут быть установлены.
public static boolean setOnce(AtomicReference<Disposable> upstream, Disposable next, Class<?> observer) {
ObjectHelper.requireNonNull(next, "next is null");
if (!upstream.compareAndSet(null, next)) {
next.dispose(); // dispose next if there is set upstream previously
if (upstream.get() != DisposableHelper.DISPOSED) {
reportDoubleSubscription(observer);
}
return false;
}
return true;
}
Вот почему вы не можете повторно подписаться с тем же экземпляром DisposableObserver, но будете работать с новым экземпляром.