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

时间:2017-05-19 16:24:35

标签: android performance firebase-authentication rx-java2

我为firebase signInWithCustomToken()方法做了一个Rxjava wrrapper,这里是代码:

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方式建模这种方法的最佳方法吗?

谢谢你。

2 个答案:

答案 0 :(得分:1)

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

if (compositeDto.containsPersonDetails()) {
    // ...
} else if (compositeDto.containsLandDetails()) {
    // ...
}
但是,如果代码中提到了问题,那么firebase并没有提供一种方法来清除emitter.setCancellable(new Cancellable() { @Override public void cancel() throws Exception { //clean memory } }); 中的那些监听器。但是其他类似DatabaseReference的removeListenr()方法在取消时清除了东西。

signwithCustomToken()

答案 1 :(得分:0)

  

它们是否与返回的Observable具有相同的生命周期,换句话说,如果我调用observable.dispose(),它们是否会从内存中清除?

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

  

我还有另一个问题抱歉,这是以Rx方式建模这种方法的最佳方法吗?

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