【问题标题】:Firebase Realtime DB timeoutFirebase 实时数据库超时
【发布时间】: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


    【解决方案1】:

    当我使用 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());
                    }
                });
    

    【讨论】:

    • 感谢您对此进行测试。我确实在使用 9.8.0,因为我目前正在模拟器上测试我的构建。 (Android 模拟器无法更新 google play 服务 :( )因为我在更新日志中没有找到任何提示,所以我没有尝试过。我今天有一部 10.0.1 的 android 手机,我可以确认它重新连接速度更快。仍然不理想,但总比没有好。谢谢
    • 经过进一步排查,发现Android Studio API 23镜像安装了Google Play Services 10.0.1。但不幸的是同样的问题。所以这似乎是一个模拟器问题。
    猜你喜欢
    • 1970-01-01
    • 2020-03-29
    • 2018-05-01
    • 2020-07-05
    • 2021-07-01
    • 1970-01-01
    • 2020-02-19
    • 2017-06-03
    • 2016-12-04
    相关资源
    最近更新 更多