Firebase:何时onDisconnect事件触发?

我使用Firebase后端为我的android应用程序。 我想为我的聊天build立一个用户在线状态系统。 为此,我采用了Firebase指南中的模式

final Firebase myConnectionsRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/users/joe/connections"); // stores the timestamp of my last disconnect (the last time I was seen online) final Firebase lastOnlineRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/users/joe/lastOnline"); final Firebase connectedRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/.info/connected"); connectedRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { boolean connected = snapshot.getValue(Boolean.class); if (connected) { // add this device to my connections list // this value could contain info about the device or a timestamp too Firebase con = myConnectionsRef.push(); con.setValue(Boolean.TRUE); // when this device disconnects, remove it con.onDisconnect().removeValue(); // when I disconnect, update the last time I was seen online lastOnlineRef.onDisconnect().setValue(ServerValue.TIMESTAMP); } } @Override public void onCancelled(FirebaseError error) { System.err.println("Listener was cancelled at .info/connected"); } }); 

麻烦的是我不知道什么时候onDisconnect事件会被解雇?

每次打开应用程序时,我都会向“ users / joe / connections ”节点写入TRUE,但是当我closures应用程序时,什么都不会发生。 当我closuresWIFI,那么布尔参数也不会被删除。 onDisconnect事件只有当我强行停止我的应用程序或重新安装这个程序或一些其他的时候,当我不能确定的时候才会被触发。

所以,据我所知,我必须手动处理这样的事件:

1)closures我的应用程序;

2)closuresWiFi;

3)也许别的东西

在我的应用程序中创buildPresencefunction? 但是当有onDisconnect事件被解雇?

Solutions Collecting From Web of "Firebase:何时onDisconnect事件触发?"

客户端和服务器断开连接时可能会发生两种情况:

  1. 客户端明确断开与服务器的连接
  2. 客户端就消失了

当你杀了应用程序,你触发一个明确的断开连接。 在这种情况下,客户端会发送一个信号给服务器,断开连接,服务器会立即执行onDisconnectcallback。

当你closureswifi,你的应用程序没有机会告诉服务器,它正在断开连接。 在这种情况下,一旦服务器检测到客户端消失, onDisconnect就会触发。 这可能需要几分钟时间,具体取决于套接字的超时configuration。 所以在这种情况下,你必须要有点耐心。

当用户退出应用程序时,可以调用admin.database().goOffline()以显式断开与admin.database().goOffline()连接,这应该触发onDisconnectcallback。 当用户返回到应用程序时,只需调用admin.database().goOnline()来重新连接到admin.database().goOnline()