5
我有这个代码库,我设置了一个值。在脱机模式下,它会成功写入,但不会调用CompletionListener.onComplete回调函数。Firebase offline no CompletionListener on setValue
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();
}
});
回调永远不会被调用。但写得很好。
在另一种情况下,即使在使用CompositeSubscription
取消订阅onDestroy
后,即使在片段未运行时,订阅者在值写入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();
,但订户得到以后调用。
谢谢你的回答。我通过检查网络是否可用然后返回错误来解决问题。 – Arka
那么当数据成功写入本地数据库时,有没有其他方式可以通知?毕竟,这是一个IO操作,可能需要一段时间。我正在考虑在我要写入的相同位置设置值侦听器,并等待onChanged回调(正确调用)。然而,这种方法似乎不太安全,因为我可能不得不检查新值是否与我正在编写的值相同。感谢您的反馈! –
@KubaSpatny我也有同样的疑问,有没有什么办法来检查一个值是否已经写入本地firebase数据库? –