我已经为 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/