2016-12-15 109 views
0

我對實時數據庫的請求實施了一個簡單的超時系統。Firebase實時數據庫超時

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獲得的值進行。

好了,所以我覺得這個工作不錯,但以下情形不工作:

當我在飛行模式下做出的請求時,超時異常火災預期。然後我禁用飛行模式併發出另一個請求。我得到另一個超時異常。

編輯:這會持續2分鐘,直到請求再次成功。

打開數據庫日誌記錄,似乎它甚至不嘗試獲取值。

我也讀過this

有什麼我可以做的嗎?

回答

2

當我使用版本10.0.1運行你的代碼時,我發現報告的行爲除了請求再次成功之前的延遲只有大約20秒。

看起來,當連接在退出飛行模式後變得可用時,它會花費很短的時間檢測到變化。您可以看到Firebase何時通過添加connection state listener來識別更改:

FirebaseDatabase.getInstance().getReference(".info/connected") 
      .addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot snapshot) { 
        if (snapshot.getValue(Boolean.class)) { 
         Log.i(TAG, "Firebase CONNECTED"); 
        } else { 
         Log.i(TAG, "Firebase NOT CONNECTED"); 
        } 
       } 

       @Override 
       public void onCancelled(DatabaseError error) { 
        Log.e(TAG, "onCancelled: ", error.toException()); 
       } 
      }); 
+0

感謝您對此進行測試。我確實使用9.8.0,因爲我目前正在模擬器上測試我的構建。 (Android模擬器無法更新谷歌播放服務:()因爲我沒有在變更日誌中找到任何提示,所以我沒有嘗試。 我有一個今天有10.0.1可用的android手機,我可以確認在重新連接後它會更快,但仍然不理想,但是更好的是什麼都沒有。謝謝 – stulleman

+0

經過進一步調查,我看到Android Studio API 23圖像安裝了Google Play Services 10.0.1 但是不幸的是,同樣的問題。似乎是一個模擬器問題。 – stulleman