Firebase实时数据库.info / connected为True时为False

时间:2018-10-30 17:07:02

标签: java android firebase firebase-realtime-database

我有一个Android服务,可通过onCreate调用此服务:

FirebaseDatabase database = FirebaseDatabase.getInstance();
database.getReference(".info/connected").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
        Log.d(TAG, "connected: " + snapshot.getValue(Boolean.class));
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
        Log.w(TAG, "Failed to read value.", error.toException());
        }
});

我注意到,当我进行大量的wifi和蜂窝数据切换时,最终会看到“ connected:false”消息,而没有“ connected:true”消息。除了Firebase实时数据库外,我还在该服务中运行Firestore,并且Firestore此时已正确连接。

然后我触发Android服务来运行以下代码:

FirebaseDatabase.getInstance().getReference("random/data").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
           // This method is called once with the initial value and again
           // whenever data at this location is updated.
           boolean connected = snapshot.getValue(Boolean.class);
           Log.d(TAG, "random data: " + connected);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
           // Failed to read value
           Log.w(TAG, "cancelled system/online.", error.toException());
        }
});

现在,我成功读取了 并打印了“ connected:true”。

发生了什么事?为什么我需要从Firebase读取.info/connected才能触发?

1 个答案:

答案 0 :(得分:2)

  

为什么我需要从Firebase读取.info/connected才能触发?

答案停留在offical documentation

  

Firebase实时数据库在/.info/connected上提供了一个特殊位置,每次Firebase实时数据库客户端的连接状态更改时,该位置都会更新。

     

/.info/connected是一个布尔值,在实时数据库客户端之间不同步,因为该值取决于客户端的状态。换句话说,如果一个客户端将/.info/connected读为false,则不能保证另一个客户端也将读为false。

     

在Android上,Firebase自动管理连接状态以减少带宽和电池消耗。如果客户端没有活动的侦听器,没有挂起的写操作或onDisconnect操作,并且没有通过goOffline方法显式断开连接,则Firebase在闲置60秒后将关闭连接。

因此,在Android上,您还可以利用连接状态管理。因此,一旦实现了上述解决方案,您将看到,如果没有连接侦听器并且最后在应用程序中没有使用setValue()进行写操作,SDK将以一种自动断开连接的方式来动态管理此操作60秒,但是ValueEventListners的存在将覆盖此设置,并确保与数据库的持续连接。您也可以查看此post中的答案。

还有另外一个post,建议您阅读以更好地理解。