我已经实现了一个简单的超时系统,以供我的实时数据库请求。
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分钟,直到请求再次成功为止。
打开数据库记录,看来它甚至没有尝试获取值。
我也读过。
我能做什么?
当我使用版本10.0.1运行您的代码时,我会看到报告的行为,除了请求之前的延迟仅约20秒。
看来,当退出飞机模式后可用连接时,Firebase需要很短的时间来检测更改。您可以通过添加连接状态侦听器来查看Firebase何时识别更改:
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());
}
});