2017-05-12 70 views
2

我試圖在沒有Internet連接或任何其他問題時使用Firebase數據庫進行讀取查詢超時。問題是,即使超時生效並且偵聽器被刪除,即使它已被刪除,它仍會被調用。我怎樣才能防止呢?什麼是處理超時的最佳方式?將超時設置爲Firebase數據庫讀取查詢

這裏是我的代碼:

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似乎有同樣的問題,但我不明白的解決方案。

+0

您是否得到了解決方案? –

+0

@ParagKadam不,我沒有看太多 –

+0

我已經解決了,檢查我的答案。 –

回答

1

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 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 
     } 
    }