Subscription isUnsubscribed returns false 即使在调用 onComplete 之后也是如此
Subscription isUnsubscribed returns false even after onComplete called
我正在尝试以反应方式转换回调,为此,我使用以下代码
Observable.create(
subscriber -> ref.authWithPassword(email, password, new FirebaseAuthResultHandler() {
@Override public void onAuthenticated(AuthData authData) {
subscriber.onNext(authData);
subscriber.onCompleted();
}
@Override public void onAuthenticationError(FirebaseError firebaseError) {
subscriber.onError(firebaseError.toException());
}
}));
这是一次性回调,所以一旦我得到结果,我希望任何订阅都完成。
因此,如果我订阅了这个 Observer 并且在 onComplete 被调用之后,我调用 isUnsubscribe() 我应该得到 true,但我没有。
Subscription subscribe = userProvider.login("some@gmail.com", "12345678")
.subscribe();
while (!subscribe.isUnsubscribed()) {
Thread.sleep(100);
}
在上面的代码中,我们永远不会跳出循环。除非出现错误,否则会调用 onError。
我是不是做错了什么或者这是预期的行为?
您的假设是正确的(订阅应该在 onComplete 之后取消订阅)但是(据我所知)您的代码将 运行 在同一个线程上。
因此 Thread.sleep
可能不允许 运行 其他操作。在 subscribe
之前附加一个 .doOnUnsubscribe()
来检查它何时取消订阅,而不是使用 sleep 如何?
我尝试使用另一个线程正确设置它,然后检查订阅状态,它 returns isUnsubscribed (true)
所以问题一定是我从同一个线程调用它。即使我正在获取回调日志。
我正在尝试以反应方式转换回调,为此,我使用以下代码
Observable.create(
subscriber -> ref.authWithPassword(email, password, new FirebaseAuthResultHandler() {
@Override public void onAuthenticated(AuthData authData) {
subscriber.onNext(authData);
subscriber.onCompleted();
}
@Override public void onAuthenticationError(FirebaseError firebaseError) {
subscriber.onError(firebaseError.toException());
}
}));
这是一次性回调,所以一旦我得到结果,我希望任何订阅都完成。
因此,如果我订阅了这个 Observer 并且在 onComplete 被调用之后,我调用 isUnsubscribe() 我应该得到 true,但我没有。
Subscription subscribe = userProvider.login("some@gmail.com", "12345678")
.subscribe();
while (!subscribe.isUnsubscribed()) {
Thread.sleep(100);
}
在上面的代码中,我们永远不会跳出循环。除非出现错误,否则会调用 onError。
我是不是做错了什么或者这是预期的行为?
您的假设是正确的(订阅应该在 onComplete 之后取消订阅)但是(据我所知)您的代码将 运行 在同一个线程上。
因此 Thread.sleep
可能不允许 运行 其他操作。在 subscribe
之前附加一个 .doOnUnsubscribe()
来检查它何时取消订阅,而不是使用 sleep 如何?
我尝试使用另一个线程正确设置它,然后检查订阅状态,它 returns isUnsubscribed (true)
所以问题一定是我从同一个线程调用它。即使我正在获取回调日志。