【问题标题】:Firebase connection check online offline status in AndroidFirebase连接检查Android中的在线离线状态
【发布时间】:2018-11-02 00:06:57
【问题描述】:

如果用户同时关闭 wi-fi、3g、4g 等并反转(没有互联网连接)。 Firebase 数据库名称子连接:(真/假) 因此,当互联网连接、wi-fi、3g、4g 等关闭或丢失时,用户处于离线状态,因此无法找到。

记住两个场景:之前和之后。如果用户在其他用户搜索他之前处于离线状态,则他不会显示在列表结果中,如果用户在其他用户搜索他后处于离线状态,则会在该用户上显示 NO MORE AVAILABLE 图标

请有人帮我解决这个问题。

【问题讨论】:

  • 您能否详细说明您的问题并具体说明?
  • 只是想在显示离线和在线用户后检查用户是否连接到互联网。

标签: java android firebase firebase-realtime-database firebase-authentication


【解决方案1】:

要解决这个问题,您可以在 Firebase 实时数据库中创建一个新节点来保存所有在线用户,因此当用户打开应用程序时,您会立即将他的 id 添加到这个新创建的节点中。然后,如果要检查用户是否在线,只需检查他的 id 是否存在于列表中即可。

您还可以为数据库中的每个用户添加一个名为 isOnline 的新属性,然后进行相应的更新。

为此,我建议您使用 Firebase 的内置 onDisconnect() 方法。它使您能够预定义在客户端断开连接时立即执行的操作。

Firebase documentation

您还可以检测用户的连接状态。对于许多与状态相关的功能,让您的应用知道它何时在线或离线很有用。 Firebase 实时数据库在 /.info/connected 提供了一个特殊位置,每次 Firebase 实时数据库客户端的连接状态更改时都会更新该位置。这是官方文档中的一个示例:

DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
    connectedRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            boolean connected = snapshot.getValue(Boolean.class);
            if (connected) {
                System.out.println("connected");
            } else {
                System.out.println("not connected");
            }
        }

        @Override
        public void onCancelled(DatabaseError error) {
            System.err.println("Listener was cancelled");
        }
});

【讨论】:

  • 我可以为互联网连接做些什么
  • 您需要上网。您应该找到一个互联网站点,以便在您的 Firebase 数据库中进行更改。
  • 我该怎么做这些前辈可以发给我完整的源代码
  • 我不明白你,一个完整的源代码是什么?在我上面的回答中,我已经向您解释了如何获取用户的状态。我建议您也查看文档并尝试一下。如果您在特定步骤中遇到困难,请展示您的尝试。
  • 一切都好吗?问题解决了吗?
【解决方案2】:

虽然这晚了一年多,但还是要澄清一下困惑。 Alex 的问题想要实现一个实时聊天场景,其中每个用户都可以在他们的终端或设备上查看每个人的在线状态。 一个简单的解决方案是创建一个节点,所有用户都将在其中注入他们的在线状态。例如

    //say your realtime database has the child `online_statuses`
    DatabaseReference online_status_all_users = FirebaseDatabase.getInstance().getReference().child("online_statuses");

    //on each user's device when connected they should indicate e.g. `linker` should tell everyone he's snooping around
    online_status_all_users.child("@linker").setValue("online");
    //also when he's not doing any snooping or if snooping goes bad he should also tell
    online_status_all_users.child("@linker").onDisconnect().setValue("offline")

因此,如果另一个用户,比如说 mario 从他的末端检查 linker,他可以确定如果 @987654324 一些窥探仍在进行中@ 在线即

    DatabaseReference online_status_all_users = FirebaseDatabase.getInstance().getReference().child("online_statuses");
    online_status_all_users.child("@linker").addValueEventListener(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {
        String snooping_status = dataSnapshot.getValue(String.class);
        //mario should decide what to do with linker's snooping status here e.g.
         if(snooping_status.contentEquals("online")){
            //tell linker to stop doing sh*t
         }else{
            //tell linker to do a lot of sh****t
         }     
      }

      @Override
      public void onCancelled(DatabaseError databaseError) {

      }
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多