Realtime Databaseへのリクエストに対して、単純なタイムアウトシステムを実装しました。FirebaseリアルタイムDBタイムアウト
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から値を取得することができない場合は続行しないので、私はこれを必要とします。
私は機内モードにいるよと要求を行う、タイムアウト例外火災が期待通り:わかりました
ので、私は、これはかなり良い動作しますが、次のシナリオが動作しないと思いました。その後、私は飛行機モードを無効にし、別の要求をします。別のタイムアウト例外が発生します。
EDIT:これは、要求が再び成功するまで2分間続きます。
データベースのログを有効にすると、値を取得しようとしないようです。
私はthisも読んでいます。
私はそれについて何かできることはありますか?
ありがとうございます。エミュレータでビルドをテストしているので、私は実際に9.8.0を使用しています。 (AndroidエミュレータはGoogle Playサービスを更新できません:()そして、私は変更履歴のヒントが見つからなかったので、試していませんでした。 今日は10.0.1のアンドロイド携帯電話を利用できました。ありがとうございました。 – stulleman
さらに調査したところ、Android Studio API 23の画像にGoogle Playサービス10.0.1がインストールされていることがわかりましたが、残念ながら同じ問題です。エミュレータの問題のようです。 – stulleman