2017-02-24 11 views
0

Firebase ValueEventListenerに関して非常に奇妙な状況が発生しています。オフライン時にFirebase onDataChangeが呼び出されない

電話機がインターネットに接続されている場合、正常に動作します。しかし、オフラインのときは、onDataChangeを呼び出していません。

このコードはオフラインでも機能します。

mDatabase = FirebaseDatabase.getInstance() 
      .getReference() 
      .child(Database.PLACES) 
      .child(((BaseActivity) getActivity()).getUserId()); 

Timber.d("TRYING TO GET PLACES"); 
mDatabase.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     Timber.d("GOT PLACES"); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     Timber.w(databaseError.toException()); 
    } 
}); 

そして、それは私にこのログを与える:しかし

D/PlaceListFragment:207: TRYING TO GET PLACES 
D/Persistence: Starting transaction. 
D/Persistence: Saved new tracked query in 1ms 
D/Persistence: Transaction completed. Elapsed: 3ms 
D/EventRaiser: Raising 1 event(s) 
D/EventRaiser: Raising /places/JLC2zqpSMFfYEGaUAfSTCHA2K4k1: VALUE: null 
D/PlaceListFragment:211: GOT PLACES 

、まったく同じコードではなく、DatabaseReference(パス)を変更すると、それは私にこのログを与え、動作しません。

D/AnalysisActivity$2$override:144: TRYING TO GET READS 
D/Persistence: Starting transaction. 
D/Persistence: Saved new tracked query in 0ms 
D/Persistence: Loaded a total of 0 rows for a total of 0 nodes at /reads/-KdiPFBrnEBHaPGCbP86 in 1ms (Query: 1ms, Loading: 0ms, Serializing: 0ms) 
D/Persistence: Transaction completed. Elapsed: 13ms 

私は、トランザクションが完了してもこのイベントが呼び出されないようにする可能性があると考えられる理由は何ですか?

何が起こっている可能性がありますか?

OBS:私のユーザーがfirebase認証correcltyで認証されており、私はこの自分のアプリケーションの設定に設定されている:あなたが書き込みデータを共有コードで

FirebaseDatabase.getInstance().setPersistenceEnabled(true); 
FirebaseDatabase.getInstance().setLogLevel(Logger.Level.DEBUG); 
+0

あなたが共有するコードには何も書き込まれません。これは、Firebaseがキャッシュからデータを戻していることを意味します。それは空のスナップショットで起動するので、あなたが読もうとしている値は決してキャッシュされませんでした。 –

+0

しかし、それは少なくともonCancelledイベントを引き起こすはずはありませんか?このコールバックを処理する方法が必要なので... –

+0

権限がないときに 'onCancelled'が起動します。クライアントはアクセス権を持っているかどうか(サーバーに接続されていないため)、値が存在するかどうか(場所が決してキャッシュされていないため)はわかりません。 –

答えて

1

何もありません。これは、Firebaseがキャッシュからデータを戻していることを意味します。それは空のスナップショットで起動するので、あなたが読もうとしていた場所は決してキャッシュされませんでした。このため、onDataChangeを呼び出すことはできません。

許可がない場合はonCancelledメソッドがトリガーされます。クライアントは、あなたが許可を持っているかどうか(サーバに接続されていないため)を知らないため、onCancelledを呼び出すことはできません。

その場所での値(もしあれば)を知らないか、または許可を得ているかどうかにかかわらず、いずれの方法も起動しません。バックエンドに再接続すると、正しいイベントが発生します。

あなたはこの新しい場所であることを知って場合、あなたはそれにnullを書き込むことによって、その場所プライムする場合があります。こうすると、キャッシュには場所の値が格納され、onDataChangeは値なしのスナップショットで呼び出されます。

+0

ありがとうございます@フランクヴァンパフレン。 nullで新しい場所をプライミングするだけでうまくいきました。 –

+0

@ frank-van-puffelen:葉が新旧のどちらであるのかわからない場合はどうすればいいですか? –

関連する問題