Firebase离线时setValue上没有CompletionListener

Ark*_*rka 6 java android firebase rx-java

我有这个代码库,我设置了一个值.在脱机模式下,它成功写入但未调用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();
            }
        });
Run Code Online (Sandbox Code Playgroud)

回调永远不会被调用.但写得很好.

在另一种情况下,即使在取消订阅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);
Run Code Online (Sandbox Code Playgroud)

onDestroy()我打电话mCompositeSubscription.unsubscribe();,但订阅者稍后被调用.

Fra*_*len 4

当写入已提交到 Firebase 服务器上的数据库时,将调用写入操作的完成侦听器。当您处于离线状态时,这种情况就不会发生。

无法取消订阅完成侦听器。如果写入操作完成时侦听器仍然存在,则会调用它。

  • 那么有没有其他方式可以在数据成功写入本地数据库时得到通知呢?毕竟,这是一个 IO 操作,可能需要一段时间。我正在考虑在我要写入的同一位置设置一个值侦听器,并等待 onChanged 回调(正确调用)。然而,这种方法似乎不太安全,因为我可能必须检查新值是否与我试图写入的值相同。感谢您的反馈! (3认同)