Firebase实时数据库超时

时间:2016-12-15 16:27:54

标签: android firebase timeout firebase-realtime-database

我已经为我的实时数据库实施了一个简单的超时系统。

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

我能做些什么吗?

1 个答案:

答案 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());
                }
            });