Firebase:当onDisconnect事件触发时?

时间:2015-06-05 13:51:47

标签: android firebase firebase-realtime-database

我正在使用Firebase-backend用于我的android应用程序。我想为我的聊天建立一个用户在线系统。为此,我采用了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,但是当我关闭app时,什么都不会发生。 当我关闭WIFI时,布尔参数也不会被删除。 onDisconnect-event仅在我强行停止我的应用程序或重新安装此应用程序时触发,或者在我无法确定时重新启动。

所以,据我所知,我必须手动处理此类事件:

1)关闭我的应用程序;

2)关闭WiFi;

3)也许别的什么

在我的应用中创建Presence功能?但是当 onDisconnect-event 被解雇时呢?

2 个答案:

答案 0 :(得分:16)

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

  1. 客户端明确断开与服务器的连接
  2. 客户端简直消失
  3. 当您终止该应用时,您将触发显式断开连接。在这种情况下,客户端将向服务器发送一个断开连接的信号,服务器将立即执行onDisconnect回调。

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

答案 1 :(得分:0)

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