2016-05-12 7 views
5

私は値を設定するこのコードベースを持っています。オフラインモードでは正常に書き込みを行いますが、CompletionListener.onCompleteコールバック関数は呼び出されません。Firebaseオフラインno setValueのCompletionListener

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 serverに書き込まれると、サブスクライバが呼び出されます。

これは正しい動作ですか? onDestroy()

 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); 

私はmCompositeSubscription.unsubscribe();を呼び出しますが、加入者は、後に呼び出されます。

答えて

3

書き込み操作の完了リスナーは、書き込みがFirebaseサーバー上のデータベースにコミットされたときに呼び出されます。あなたがオフラインになっても、それは起こりません。

完了リスナーの登録を解除する方法はありません。書き込み操作が完了したときにリスナーがまだ存在する場合は、リスナーが呼び出されます。

+1

ありがとうございました。私はネットワークが利用可能であるかどうかをチェックしてエラーを返すことで問題を回避しました。 – Arka

+2

データがローカルデータベースに正常に書き込まれたときに通知する他の方法はありますか?結局のところ、それはしばらく時間がかかるIO操作です。私は書いているのと同じ場所に値リスナを設定し、onChangedコールバック(これは適切に呼ばれます)を待ちます。しかし、このアプローチは、おそらく私は新しい値が私が書き込もうとしている値と同じであるかどうかをチェックしなければならないので、あまり安全ではないように見えます。フィードバックありがとう! –

+0

@KubaSpatny私は同じ疑問も持っています。値がローカルFirebaseデータベースに書き込まれているかどうかを確認する方法はありますか? –

関連する問題