2017-05-12 6 views
2

Ich versuche, ein Leseabfragetimeout mit Firebase-Datenbank zu machen, wenn keine Internetverbindung oder ein anderes Problem besteht. Das Problem ist, dass selbst wenn das Zeitlimit wirksam wird und der Listener entfernt wird, er trotzdem aufgerufen wird, obwohl er entfernt wurde. Wie kann ich das verhindern? Was ist der beste Weg, um Timeout zu verarbeiten?Legen Sie eine Zeitüberschreitung für eine Firebase-Datenbankabfrage fest

Hier ist mein Code:

final DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("key"); 
final ValueEventListener listener = new ValueEventListener() { /* ... */ }; 
ref.addListenerForSingleValueEvent(listener); 

Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     ref.removeEventListener(listener); 
    } 
}, 5000); 

Someone here scheint das gleiche Problem zu haben, aber ich verstehe nicht die Lösung.

+0

Haben Sie die Lösung schon bekommen? –

+0

@ParagKadam Nein, ich habe nicht viel darauf geachtet –

+0

Ich habe es gelöst, überprüfen Sie meine Antwort aus. –

Antwort

1

Es gibt nichts wie Timeout in der Firebase-API, daher sollten Zeitüberschreitungen mit unserer eigenen Logik behandelt werden. So implementiere ich Timeouts in meinem Code.

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 async 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 
     } 
    } 
Verwandte Themen