Firebase:onDisconnect 事件何时触发?

Posted

技术标签:

【中文标题】Firebase:onDisconnect 事件何时触发?【英文标题】:Firebase: when onDisconnect event fire? 【发布时间】:2015-08-20 12:11:37 【问题描述】:

我正在为我的 android 应用程序使用 Firebase 后端。我想为我的聊天建立一个用户存在系统。为此,我采用了 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 事件?!

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

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

1) 关闭我的应用;

2) 关闭 WiFi;

3) 也许是别的东西

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

【问题讨论】:

【参考方案1】:

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

    客户端显式断开与服务器的连接 客户端消失了

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

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

如果这个间隔对你来说不够精细,你能做的最好的事情就是定期更新数据库中所谓的 keep-alive 值,间隔更短。通过这种方式,您可以查看客户端最近的活动时间,并在太久之前采取行动。

【讨论】:

我不明白。当用户按下 BACK 按钮并关闭所有活动时,onDisconnect() 不会触发。但是在这种情况下,用户应该考虑离线吧? @iForests 我认为When a user press the BACK button and close all activities 应该在 ActivityLifecycleCallbacks 中处理 @Frank_van_Puffelen 服务器检测到客户端消失需要多长时间才能达到最大值?而这对于服务器来说需要几分钟是不切实际的,因为下线应该立即触发Firebase Server中的相关功能,以便用户了解彼此的状态。 如果应用程序崩溃,它会随机失效。我的价值观已经好几天没有改变了。您确定服务器超时有效吗?我们是否必须在项目仪表板中执行任何操作来配置超时? 不需要任何设置,并且它已在足够多的项目中使用,以确保它(通常)有效。如果您有可重现的案例,请通过 MCVE 或 file a bug report 向 Firebase 支持团队(也包括 MCVE)提出新问题。【参考方案2】:

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

【讨论】:

以上是关于Firebase:onDisconnect 事件何时触发?的主要内容,如果未能解决你的问题,请参考以下文章

与firebase onDisconnect反应本机

Firebase onDisconnect()不起作用

Firebase 连接检测在 60 秒后不起作用

IONIC 2 native Network.onDisconnect() 运行代码两次

如何为定位服务实现 onConnectionFailed() 和 onDisconnected()

onDisconnect 在客户端重新连接时触发