12

我正在为我的 android 应用程序使用 Firebase 后端。我想为我的聊天建立一个用户存在系统。为此,我采用了 Firebase Guide 中的模式

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事件?!

每次我打开应用程序时,我都会将 TRUE 写入节点“ users/joe/connections ”,但是当我关闭应用程序时,什么都不会发生。当我关闭 WIFI 时,布尔参数也不会被删除。onDisconnect-event 仅在我强制停止我的应用程序或重新安装此应用程序或其他我无法确定时触发。

因此,据我了解,我必须手动处理此类事件:

1)关闭我的应用程序;

2)关闭WiFi;

3)也许是别的东西

在我的应用程序中创建 Presence 功能?但是什么时候触发onDisconnect-event呢?

4

2 回答 2

22

当客户端和服务器断开连接时,可能会出现两种情况:

  1. 客户端显式断开与服务器的连接
  2. 客户只是消失了

当您终止应用程序时,您将触发显式断开连接。在这种情况下,客户端将向服务器发送它正在断开连接的信号,并且服务器将立即执行onDisconnect回调。

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

如果这个间隔对你来说不够精细,你能做的最好的就是定期更新数据库中所谓的保持活动值,更短的间隔。通过这种方式,您可以查看客户最近一次活动的时间,如果时间太长,您可以采取行动。

于 2015-06-05T16:00:55.110 回答
0

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

于 2017-01-21T23:12:31.070 回答