2016-04-27 6 views
6

Firebaseでクエリを実行し、データベースサーバに到達できない場合、コールバックは永遠に(またはサーバが再び到達可能になるまで)待機することに気付きました。Firebaseでクエリのタイムアウトを処理する方法

この動作は、使用される非同期アプローチでは当然ですが、タイムアウトを指定する簡単な方法を使用して、ユーザーにステータスを知らせることができます。

このようなオプションがあり、私はそれを逃したばかりか、それとも本当に欠けていますか? またはこの問題をどのように解決しますか?

+0

ユーザがFirebaseサーバに接続されているかどうかを検出する場合は、['.info/connected'](https://www.firebase.com/docs/web/guide/offline)をご覧ください。 -capabilities.html#section-connection-state)。 –

+0

同じ問題に直面していました。最後に、タイマーをタイムアウトとしてマークするためにクエリの周りに置く。 Borstzフレームワークを使用してタスクを管理する(BFTask)、特に複数のクエリを扱う場合には、プロセス全体が簡単でした。 – Amit

答えて

2

あなたはfirebaseの参照にリスナーをx秒後に削除すると自分自身を管理することができます。それは非常に単純です、たとえばAndroidのコードの1行だけです。

あなたがウェブ(デタッチコールバックセクション)のコードを見ることができます

https://www.firebase.com/docs/web/guide/retrieving-data.html

やAndroid用 (デタッチコールバックセクション):IOSのための https://www.firebase.com/docs/android/guide/retrieving-data.html#section-detaching

同じセク​​ション;)

+0

observeSingleEventOfType、これはハンドルを取得しないため、コールバックをデタッチできなくなります。 – Amit

2

として、今日、これらのリスナーにはタイムアウトの概念はありません。 1つの方法は、タイムアウトを自分で管理することです。

これは、コンテンツのロード中に進行状況ダイアログも表示したいときに行う方法です。

private void showProgressDialog(boolean show, long time) { 
    try { 
     if (progressDialog != null) { 
      if (show) { 
       progressDialog.setMessage("Cargando..."); 
       progressDialog.show(); 
       new Handler().postDelayed(new Runnable() { 
        public void run() { 
         if(progressDialog!=null && progressDialog.isShowing()) { 
          progressDialog.dismiss(); 
          Toast.makeText(ActPreguntas.this, "Couldn't connect, please try again later.", Toast.LENGTH_LONG).show(); 
         } 
        } 
       }, time); 
      } else { 
       progressDialog.dismiss(); 
      } 
     } 
    }catch(IllegalArgumentException e){ 
    }catch(Exception e){ 
    } 
} 

だから、ダイアログ静止画がある場合、それは接続できませんでした、あなたは、あなたがタイムアウトごとなどに持って何をので、あなたが(、5000真)と5秒後にshowProgressDialogを呼び出すFirebaseするための要求を行うとき。このshowProgressDialogが行うFirebaseリスナーのコールバックで

(偽、0)

はそれがお役に立てば幸いです。

関連する問題