firebase连接检查android中的在线离线状态

时间:2018-05-23 06:07:25

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

如果用户同时关闭wi-fi,3g,4g等,则反向(无互联网连接)。 Firebase数据库名称子连接:(true / false) 因此,当互联网连接,Wi-Fi,3g,4g等关闭或丢失时,用户处于脱机状态,因此无法找到他。

请记住两种情况:之前和之后。如果用户在其他用户搜索他之前处于离线状态,那么他将不会显示在列表结果中,如果用户在其他用户搜索后离线,那么它将在用户上显示“无更多可用”图标

请帮助我解决这个问题。 提前致谢。

2 个答案:

答案 0 :(得分:0)

要解决此问题,您可以在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");
        }
});

答案 1 :(得分:0)

尽管这已经晚了一年多,但还是要消除混乱。亚历克斯(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 ,他可以确定如果< strong> linker 已在线,即

    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) {

      }
    });