【发布时间】:2016-12-16 05:34:49
【问题描述】:
我为实时数据库的请求实现了一个简单的超时系统。
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。
我能做些什么吗?
【问题讨论】:
标签: android firebase timeout firebase-realtime-database