我为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方式建模这种方法的最佳方法吗?
谢谢你。
答案 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
将只解开Subscriber
和Observable
之间的连接并停止发出事件,但是监听器将保持注册到firebaseAuth
并且可能发生内存泄漏
我还有另一个问题抱歉,这是以Rx方式建模这种方法的最佳方法吗?
使用RxJava2创建方法是包装异步回调方法的有效方法。但是,对于RxJava2,具有最低开销的默认方式是扩展Observable
并使用Observer
方法来通知事件/寄存器dispose回调。你可以阅读更多here。