Android Firebase - "onDataChange"和"onCancelled"在没有Internet连接的情况下无法调用

Raf*_*afi 11 android firebase firebase-realtime-database

在我的应用程序中,我只是尝试Firebase通过ListenerForSingleValueEvent在以下代码中添加一个来从我的数据库中检索读取段落:

myRef.child("passages").child(passageNum).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                System.out.println("ON DATA CHANGE");
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                System.out.println("DATABASE ERROR");
                FirebaseErrorHandler.handleDatabaseError(databaseError.getCode(), ReadingActivity.this);
            }

        });
Run Code Online (Sandbox Code Playgroud)

当有互联网连接时,它工作得很好.但是,当我故意关闭互联网连接时,既没有onDataChange也没有onCancelled被呼叫.这非常令人沮丧,因为其中两个错误代码databaseError.getCode()与网络连接问题有关.

如果我不能在此获得的数据由于没有互联网,我想至少让用户知道,而不是有这个监听器挂在屏幕不断加载.有办法解决这个问题吗?我是否只需要使用Firebase'sREST API?至少对于RESTful网络请求,它们会通知您连接是否失败.

Fra*_*len 8

Firebase将数据事件流(例如onDataChange())与可能发生的其他事件分开.它只会onCancelled在有服务器端原因时才会调用(目前仅在客户端没有访问数据的权限时).没有理由取消监听器,因为没有网络连接.

您似乎正在寻找的方法是检测是否存在网络连接(这不是特定于Firebase的任务)或用户是否连接到Firebase数据库后端.后者可以通过附加一个监听器来实现.info/connected,这是一个隐式布尔值,true当你连接到Firebase数据库后端时,就是这样false.有关完整详细信息,请参阅文档中有关检测连接状态的部分.

  • 这是一个解决方案,但不是所需的解决方案.我可以在对firebase数据库进行任何查询之前检查互联网可用性,但这并不好,因为我想让我的应用程序100%离线.假设,当我第一次启动应用程序而没有连接互联网时,firebase数据库没有数据并且卡在回调中.如果至少第一次提供互联网连接,则问题在后续运行中消失.如何解决这个问题?如果Firebase至少在onCancelled()中提供了这个信息,那真的会更好. (9认同)
  • 在运行任何查询之前,我必须检查一个标志,这真的很不幸.对于**单值**事件侦听器,如果firebase无法获取该值,则应返回错误.当前的行为只是推动了应用程序处理所有这些复杂性. (6认同)