在我的应用程序中,我只是尝试通过在以下代码中添加 ListenerForSingleValueEvent
从我的 Firebase
数据库中检索阅读文章:
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);
}
});
当有互联网连接时,它工作得很好。但是,当我故意关闭互联网连接时,onDataChange
和 onCancelled
都不会被调用。这非常令人沮丧,因为 databaseError.getCode()
中的两个错误代码与网络连接问题有关。
如果由于没有互联网而无法获取此数据,我想至少让用户知道这一点,而不是让这个监听器随着屏幕不断加载而挂起。有办法解决这个问题吗?我是否必须求助于 Firebase 的
REST API?至少对于 RESTful 网络请求,它们会让您知道连接是否失败。
最佳答案
Firebase 将数据事件流(例如 onDataChange()
)与可能发生的其他事情分开。它只会在服务器端有理由这样做时调用onCancelled
(目前仅当客户端没有访问数据的权限时)。没有理由取消监听器,只是因为没有网络连接。
您似乎在寻找一种方法来检测是否存在网络连接(这不是特定于 Firebase 的任务)或用户是否已连接到 Firebase 数据库后端。后者可以通过将监听器附加到 .info/connected
来完成,这是一个隐式 bool 值,当您连接到 Firebase 数据库后端时为 true
并且是false
否则。请参阅 document on detecting connection state 中的部分了解全部详情。
关于Android Firebase - "onDataChange"和 "onCancelled"没有被调用没有互联网连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39021378/