在我的应用中,我使用的是Firebase数据库。现在,当我正在侦听特定位置的子节点的任何更改时,如果没有Internet连接,则不会触发回调。 firebase电话被卡住了。
我正在使用它,
FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
firebaseDatabase.setPersistenceEnabled(true);
因此,启用了持久性。问题只出现在一个场景中。当Firebase的本地持久性没有数据且互联网连接也不可用时。
我正在使用它,
addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
Timber.d("Cancelled");
}
});
我没有得到针对该特定场景的两个回调中的任何一个。
我应该怎样做才能解决这种情况?
答案 0 :(得分:8)
让我们看看在没有连接时如何触发这些方法:
onCancelled
- 当出现服务器端错误时。例如,当用户无法访问指定节点时。 (或者当你达到Sparkle计划的连接限制时)。
onDataChange
- 如果有数据持续存在,它将读取此数据。如果没有,这种方法不会被触发(你的情况)。
根据Firebase Documentation,如果要检查设备是否已连接到Firebase服务器,则可以向.info/connected
添加侦听器。像这样:
DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
connectedRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
boolean connected = snapshot.getValue(Boolean.class);
if (connected) {
Toast.makeText(this, "Connected", Toask.LENGTH_SHORT);
} else {
Toast.makeText(this, "Not connected", Toask.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(DatabaseError error) {
}
});