2017-05-19 36 views
0

我做了一个Rxjava wrrapper的火力signInWithCustomToken()方法,这里是代码:是什么ObservableOnSubscribe回调里面听众的生命周期 - 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(); 
       } 
      }); 
     } 
    }); 
    } 

,所以我想知道什么是三名听众的生命周期( OnSuccessListener - OnFailureListener() - OnCompleteListener)里面的Rx回调,他们有相同的生命周期的回报Observable,换句话说,如果我打电话observable.dispose(),他们会从内存中清除?

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

谢谢你在avance。

回答

0

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

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

但是与相关代码提及的情况下,即火力不提供以清除signwithCustomToken()那些听众的方法。但其他像DatabaseReference有removeListenr()方法来取消时清除的东西。

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

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

不,你需要指定自己支配逻辑,且有从firebaseAuth删除你的听众,您可以使用Emitter.setDisposable()Emitter.setCancellable()做到这一点,如果你不提供它,那么Observable只会解开连接在SubscriberObservable之间,并且将停止发射事件,但听众将保持注册到firebaseAuth并且可能发生内存泄漏。

我还有一个问题,对不起,这是用Rx方式建模这种方法的最佳方法吗?

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

相关问题