我有这个代码库,我设置了一个值。在脱机模式下,它成功写入但未调用CompletionListener.onComplete回调函数。
newOrderRef.setValue(order, (firebaseError, firebase) -> {
if (firebaseError != null) {
Timber.e(firebaseError.toException(), "Order create failed, id: %s", order.getOrderId());
subscriber.onError(firebaseError.toException());
} else {
Timber.i("Order created, id: %s", order.getOrderId());
newOrderRef.setPriority(0 - timestamp);
subscriber.onNext(firebase.getKey());
subscriber.onCompleted();
}
});
回调永远不会被调用。但写得很好。
在另一种情况下,即使在使用onDestroy
取消订阅CompositeSubscription
之后,即使片段未运行,当值写入firebase服务器时也会调用订阅者。
这是正确的行为吗?
Subscription orderSubscription = OrderManager.createOrder(order)
.subscribe(s -> {
fabShowSuccess();
showSnackbar("onnext Order created " + order.getOrderId());
}, throwable -> {
showSnackbar("Order failed. Make sure your are connected to internet.");
fabShowFailed();
}, () -> {
fabShowSuccess();
showSnackbar("Order created " + order.getOrderId());
});
mCompositeSubscription.add(orderSubscription);
在onDestroy()
中,我呼叫mCompositeSubscription.unsubscribe();
,但稍后会调用该订阅者。
答案 0 :(得分:4)
当写入已提交到Firebase服务器上的数据库时,将调用写入操作的完成侦听器。当您离线时,这不会发生。
无法取消订阅完成侦听器。如果在写操作完成时侦听器仍然存在,则将调用它。