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获得值。

我不想继续进行。

好吧,我认为这很好,但是遵循场景不起作用:

当我处于飞机模式并提出请求时,超时异常会按预期触发。然后,我禁用飞机模式并提出另一个请求。我还有另一个超时例外。

编辑:持续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());
                }
            });

相关内容

  • 没有找到相关文章

最新更新