2017-09-24 15 views
2

addListenerForSingleValueEventを使用してFirebaseからデータをフェッチするときに、どのように接続/読み取りタイムアウトを追加しますか? addListenerForSingleValueEventを使用してデータを取得する呼び出しを行うと、ProgressBarが表示され、データがonDataChangeにフェッチされたときまたはonCancelledに何らかのエラーが発生したときに再びProgressBarが表示されなくなります。しかし、インターネット接続がない場合、は、onDataChangeまたはonCancelledが決して呼び出されないため、永遠に見えます。 ProgressBarをもう一度見えなくするにはどうすればよいですか?私はタイムアウトはこれの良い解決策だと思うが、ファイアウォールAPIでタイムアウトのようなものは見つからない。タイムアウトから離れてこの問題を解決する別の方法があるなら、私に知らせてください。ありがとう。firebaseデータベースから値を読み取るときにタイムアウトしますか?

+3

FirebaseデータベースAPIにはタイムアウトはありません。しばらくしてからリッスンを止めたい場合は、独自の仕組みを使用する必要があります。 –

+0

答えはダグのように聞こえます。 :-) –

+0

@DougStevensonありがとう。私はこれがすぐにカードにあることを願っています。 –

答えて

1

@Doug Stevensonによると、Firebase APIにはタイムアウトのようなものはないので、タイムアウトは独自のロジックを使用して処理する必要があります。これは私のコードでタイムアウトを実装する方法です。

private void getDataFromFirebase() 
{ 
    final boolean[] gotResult = new boolean[1]; 
    gotResult[0] = false; 

    FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance(); 
    DatabaseReference dataReference = firebaseDatabase.getReference().child("data"); 

    ValueEventListener dataFetchEventListener = new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      gotResult[0] = true; 
      // You code goes here 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      gotResult[0] = true; 
     } 
    }; 

    if(isNetworkAvailable()) { 

     dataReference.addListenerForSingleValueEvent(dataFetchEventListener); 
     Timer timer = new Timer(); 
     TimerTask timerTask = new TimerTask() { 
      @Override 
      public void run() { 
       timer.cancel(); 
       if (gotResult[0] == false) { // Timeout 
        dataReference.removeEventListener(dataFetchEventListener); 
        // Your timeout code goes here 
       } 
      } 
     }; 
     // Setting timeout of 10 sec to the request 
     timer.schedule(timerTask, 10000L); 
    } 
    else{ 
     // Internet not available 
    } 
} 
関連する問題