我已经为我的实时数据库实施了一个简单的超时系统。
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();
}
我需要这个,因为我想检查是否已经使用了用户名,如果我无法从数据库中获取值,我不想继续。
好的,所以我认为这种方法非常好但是后续方案不起作用:
当我处于飞行模式并发出请求时,超时异常会按预期触发。然后我禁用飞行模式并发出另一个请求。我得到另一个超时异常。
编辑:这会持续2分钟,直到请求再次成功。
启用数据库日志记录,似乎它甚至都没有尝试获取值。
我还阅读了this。
我能做些什么吗?
答案 0 :(得分:2)
当我使用版本10.0.1运行代码时,我看到报告的行为,除了请求再次成功之前的延迟只有大约20秒。
似乎在退出飞行模式后连接可用时,Firebase需要很短的时间来检测更改。您可以通过添加connection state listener:
来查看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());
}
});