2016-08-18 18 views
9

で呼び出されていない「onCancelled」、私は単純に次のコードでListenerForSingleValueEventを追加することによって、私のFirebaseデータベースから読み取り通路を取得しよう:アンドロイドFirebase - 「OnDataChangeの」そして、私のアプリではありませんインターネット接続

myRef.child("passages").child(passageNum).addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       System.out.println("ON DATA CHANGE"); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       System.out.println("DATABASE ERROR"); 
       FirebaseErrorHandler.handleDatabaseError(databaseError.getCode(), ReadingActivity.this); 
      } 

     }); 

インターネット接続があれば完璧に動作します。しかし、意図的にインターネット接続をオフにすると、onDataChangeonCancelledも呼ばれていません。 databaseError.getCode()のエラーコードの2つがネットワーク接続の問題と関係しているので、これは非常に不満です。

インターネットがないためにこのデータを取得できない場合は、このリスナーに画面が常に表示されるのではなく、少なくともユーザーに知らせる必要があります。これを解決する方法はありますか? Firebase's REST APIに頼らざるを得ませんか?少なくともRESTfulネットワーク要求では、接続が失敗したかどうかを知らせます。

答えて

5

Firebaseは、発生する可能性がある他の事象とデータイベントのフロー(例えば、onDataChange())を区切ります。サーバ側の理由がある場合(現在はクライアントにデータへのアクセス権がない場合にのみ)、onCancelledが呼び出されます。リスナーをキャンセルする理由はありません。ネットワーク接続がないからです。

あなたが探しているように見えるのは、ネットワーク接続(Firebase固有のタスクではない)があるか、またはユーザーがFirebaseデータベースのバックエンドに接続しているかどうかを検出する方法です。後者の場合は、リスナーを.info/connectedに接続します。暗黙のブール値は、Firebaseデータベースのバックエンドに接続しているときはtrue、それ以外の場合はfalseです。詳細については、document on detecting connection stateのセクションを参照してください。

+5

これは解決策ですが、望ましいものではありません。私はfirebaseデータベースへのクエリを行う前にインターネットの可用性をチェックすることができますが、それは私のアプリを100%オフラインにしておきたいのでうまくいかないでしょう。私がインターネット接続なしで初めてアプリを起動したとき、firebaseデータベースはデータを持たず、コールバックにはまっていないとします。インターネット接続が少なくとも最初に提供された場合、この問題は後続の実行で消えます。このシナリオに取り組む方法は? Firebaseが少なくともonCancelled()にこの情報を提供すれば本当に良いでしょう。 –

+0

@AritraRoyこの問題をどうやって処理しましたか?あなたはこれに対する解決策を見つけましたか? –

+3

これは本当に残念ですが、クエリを実行する前にフラグをチェックする必要があります。 **単一値**イベントリスナーの場合、値を取得できなかった場合、firebaseはエラーを返します。現在の動作は、アプリが対処するために、この複雑さをすべて押し上げるだけです。 –

関連する問題