ObservableOnSubscribe 回调中监听器的生命周期是什么 - Rxjava

what is lifecycle of listeners inside ObservableOnSubscribe callback - Rxjava

我已经为 firebase signInWithCustomToken() 方法完成了一个 Rxjava 包装器,这里是代码:

public Observable<AuthResult> signInWithCustomToken(String token) {
    return Observable.create(new ObservableOnSubscribe<AuthResult>() {
      @Override public void subscribe(ObservableEmitter<AuthResult> emitter) throws Exception {
        firebaseAuth.signInWithCustomToken(token)
            .addOnSuccessListener(new OnSuccessListener<AuthResult>() {
              @Override public void onSuccess(AuthResult result) {
                emitter.onNext(result);
              }
            })
            .addOnFailureListener(new OnFailureListener() {
              @Override public void onFailure(@NonNull Exception e) {
                emitter.onError(e);
              }
            })
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
              @Override public void onComplete(@NonNull Task<AuthResult> task) {

                emitter.onComplete();
              }
            });
      }
    });
  }

所以我想知道 Rx 回调中的三个监听器 (OnSuccessListener - OnFailureListener() - OnCompleteListener) 的生命周期是什么,它们是否与 return 可观察的,换句话说,如果我调用 observable.dispose(),它们会从内存中清除吗?

抱歉,我还有一个问题,这是以 Rx 方式对此类方法进行建模的最佳方式吗?

提前谢谢你。

Do they have the same lifecycle of the return Observable, in other words if I called observable.dispose(), will they be cleared from memory?

不,你需要自己指定一次性逻辑,然后从 firebaseAuth 中删除你的监听器,你可以使用 Emitter.setDisposable()Emitter.setCancellable(),如果你不会提供它,然后 Observable 只会解开 SubscriberObservable 之间的连接,并停止发出事件,但侦听器将保持注册到 firebaseAuth 和内存泄漏可能会发生。

and I have another question sorry, is this the best way for modeling such a method in Rx way?

使用 RxJava2 创建方法是包装异步回调方法的有效方法。但是,对于 RxJava2,开销最低的默认方式是扩展 Observable 并使用 Observer 方法来通知事件/注册处置回调。你可以阅读更多 .

我正在回答我的问题,调用 dispose() 并不能保证从内存中移除那些监听器。但是有一个很好的解决方案。 每次你从监听器或回调创建一个 Observable 时,确保设置一个 Cancellable 并清除那里的东西。

emitter.setCancellable(new Cancellable() {
  @Override
  public void cancel() throws Exception {
  //clean memory
 }
});

然而,在有问题的代码提及的情况下,firebase 没有提供清除 signwithCustomToken() 中的那些侦听器的方法。但其他像 DatabaseReference 有 removeListenr() 方法来在取消时清除东西。

emitter.setCancellable(new Cancellable() {
  @Override
  public void cancel() throws Exception {
    databaseReference.removeEventListener(valueEventListener);
 }
});