ObservableOnSubscribe 回调中监听器的生命周期是什么 - Rxjava
what is lifecycle of listeners inside ObservableOnSubscribe callback - Rxjava
我已经为 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
) 的生命周期是什么,它们是否与 return 可观察的,换句话说,如果我调用 observable.dispose()
,它们会从内存中清除吗?
抱歉,我还有一个问题,这是以 Rx 方式对此类方法进行建模的最佳方式吗?
提前谢谢你。
Do they have the same lifecycle of the return Observable, in other words if I called observable.dispose(), will they be cleared from memory?
不,你需要自己指定一次性逻辑,然后从 firebaseAuth
中删除你的监听器,你可以使用 Emitter.setDisposable()
或 Emitter.setCancellable()
,如果你不会提供它,然后 Observable
只会解开 Subscriber
和 Observable
之间的连接,并停止发出事件,但侦听器将保持注册到 firebaseAuth
和内存泄漏可能会发生。
and I have another question sorry, is this the best way for modeling such a method in Rx way?
使用 RxJava2 创建方法是包装异步回调方法的有效方法。但是,对于 RxJava2,开销最低的默认方式是扩展 Observable
并使用 Observer
方法来通知事件/注册处置回调。你可以阅读更多 .
我正在回答我的问题,调用 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);
}
});
我已经为 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
) 的生命周期是什么,它们是否与 return 可观察的,换句话说,如果我调用 observable.dispose()
,它们会从内存中清除吗?
抱歉,我还有一个问题,这是以 Rx 方式对此类方法进行建模的最佳方式吗?
提前谢谢你。
Do they have the same lifecycle of the return Observable, in other words if I called observable.dispose(), will they be cleared from memory?
不,你需要自己指定一次性逻辑,然后从 firebaseAuth
中删除你的监听器,你可以使用 Emitter.setDisposable()
或 Emitter.setCancellable()
,如果你不会提供它,然后 Observable
只会解开 Subscriber
和 Observable
之间的连接,并停止发出事件,但侦听器将保持注册到 firebaseAuth
和内存泄漏可能会发生。
and I have another question sorry, is this the best way for modeling such a method in Rx way?
使用 RxJava2 创建方法是包装异步回调方法的有效方法。但是,对于 RxJava2,开销最低的默认方式是扩展 Observable
并使用 Observer
方法来通知事件/注册处置回调。你可以阅读更多
我正在回答我的问题,调用 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);
}
});