2016-05-12 34 views
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();,但订户得到以后调用。

回答

3

写入操作的完成侦听器将在写入提交给Firebase服务器上的数据库时调用。当你离线时,这不会发生。

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

+1

谢谢你的回答。我通过检查网络是否可用然后返回错误来解决问题。 – Arka

+2

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

+0

@KubaSpatny我也有同样的疑问,有没有什么办法来检查一个值是否已经写入本地firebase数据库? –