如何使用Firebase创建用户在线机制?

时间:2018-03-29 03:25:07

标签: android firebase firebase-realtime-database

我想更改用户状态以显示他是否在线。我想在数据库当用户关闭应用程序时或用与服务器失去连接时将用户状态更改为false。 enter image description here

正如名为onDisconnect()的方法可用。我使用该方法使用以下代码更新用户状态。

HashMap<String,Object>   user_online_status=new HashMap<String,Object>(); 
user_online_status.put("online",true); 
DatabaseReference firebaseDatabase=FirebaseDatabase.getInstance().getReference().child("Users").child(userId);  

  firebaseDatabase.updateChildren(user_online_status); 
  //then to show  user offline 
  user_online_status.put("online",false);
  firebaseDatabase.onDisconnect().updateChildren(user_online_status); 

我执行该任务,但因为它是在客户端,如果我们想监视用户与服务器的连接,并且当连接终止时,节点应该由服务器而不是客户端更新。如何当用户失去与服务器的连接时,我们可以从服务器更改节点值吗?

1 个答案:

答案 0 :(得分:4)

用户可以通过两种方式与Firebase数据库断开连接。

  1. 一个干净的断开连接,客户端在断开连接之前向服务器发送信号。
  2. 一个脏(缺少一个更好的术语)断开连接,在客户端发送信号之前连接关闭。
  3. 如果断开连接,您的onDisconnect处理程序将立即触发,因此您的数据库将立即更新。

    如果出现脏连接,Firebase会依赖套接字层在远程客户端消失时发出信号。这可能需要几分钟的时间。但最终服务器将检测/判断客户端已消失,并且您的onDisconnect处理程序触发。

    数据结构中的一个小注释:您在用户和连接之间存在1:1的关系。不幸的是,情况并非如此。

    • 用户可以从多个设备连接。如果他们现在与其中一个设备断开连接,则该设备的onDisconnect会将online设置为false,而他们可能仍会在另一台设备上连接。
    • 移动设备/网络习惯偶尔会出现断开/重新连接周期。这意味着您可能有多个连接,即使在单个设备上也是如此。如果脏连接断开,onDisconnect处理程序可能会在以后为您的新连接设置onlinetrue时触发。在这种情况下,您的onDisconnect处理程序会将online设置为false,而用户可能已经重新连接。

    所有这一切都是说您不应该依赖于用户与其连接之间的1:1关系。 samples in the Firebase documentation treat connections as a collection并假设用户已连接,只要有任何&#34;连接ID&#34; (由push()生成)留给该用户。我建议你这样做,以防止难以调试竞争条件和连接问题。