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

标签 android performance firebase-authentication rx-java2

我已经为 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)的生命周期是什么,它们是否具有与返回 Observable 相同的生命周期,换句话说,如果我调用 observable.dispose(),它们是否会从内存中清除?

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

先谢谢你。

最佳答案

我正在回答我的问题,调用 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);
 }
});

关于android - ObservableOnSubscribe 回调中监听器的生命周期是什么 - Rxjava,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44074778/

相关文章:

java - 保存Android文本文件不会在文件中写入文本

android - 类未找到异常 : Didn't find class "android.support.constraint.ConstraintLayout" on path

java - 安卓.view.InflateException : Binary XML file line #6: Error inflating class fragemnt

regex - 哪个是更有效的正则表达式?

javascript - 使用 ULP 比较 double (最后一位的单位)

javascript - Firebase:电子邮件验证和用户登录才能访问该页面

Android市场帐户: are they,全部,*@gmail.com?

java - 应用数据清除后如何退出Google?

android - facebook登录仅显示以前在flutter应用中登录的帐户

javascript - 创建具有大索引的 JavaScript 数组的好方法是什么?