2016-12-15 11 views
0

Realtime Databaseへのリクエストに対して、単純なタイムアウトシステムを実装しました。FirebaseリアルタイムDBタイムアウト

private void makeRequestWithTimeout(final int timeout, final DatabaseReference reference, final OnTimeoutRequestListener listener) { 

    Thread thread = new Thread() { 
     boolean connected = false; 
     boolean exited = false; 

     @Override 
     public void run() { 

      reference.addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        if (!exited) { 
         listener.onSuccess(dataSnapshot); 
         connected = true; 
        } 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        if (!exited) { 
         listener.onFailure(databaseError.toException()); 
         connected = true; 
        } 
       } 
      }); 

      try { 
       sleep(timeout); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

      if (!connected) { 
       listener.onFailure(new Exception("Timeout, request exceeded " + timeout + "ms timeout")); 
       exited = true; 
      } 
     } 
    }; 

    thread.start(); 
} 

私は、たとえば、ユーザ名がすでに使用されているかどうかを確認したい、と私は私がDBから値を取得することができない場合は続行しないので、私はこれを必要とします。

私は機内モードにいるよと要求を行う、タイムアウト例外火災が期待通り:わかりました

ので、私は、これはかなり良い動作しますが、次のシナリオが動作しないと思いました。その後、私は飛行機モードを無効にし、別の要求をします。別のタイムアウト例外が発生します。

EDIT:これは、要求が再び成功するまで2分間続きます。

データベースのログを有効にすると、値を取得しようとしないようです。

私はthisも読んでいます。

私はそれについて何かできることはありますか?

答えて

2

バージョン10.0.1でコードを実行すると、要求が成功するまでの遅延が約20秒にとどまることを除いて、報告された動作が表示されます。

飛行機モードを終了して接続が利用可能になると、Firebaseは変更を検出するのに短時間かかります。 Firebaseがいつ変更を認識するかは、connection state listener

+0

ありがとうございます。エミュレータでビルドをテストしているので、私は実際に9.8.0を使用しています。 (AndroidエミュレータはGoogle Playサービスを更新できません:()そして、私は変更履歴のヒントが見つからなかったので、試していませんでした。 今日は10.0.1のアンドロイド携帯電話を利用できました。ありがとうございました。 – stulleman

+0

さらに調査したところ、Android Studio API 23の画像にGoogle Playサービス10.0.1がインストールされていることがわかりましたが、残念ながら同じ問題です。エミュレータの問題のようです。 – stulleman

関連する問題