Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android聊天应用程序检查在线/离线用户firebase_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java Android聊天应用程序检查在线/离线用户firebase

Java Android聊天应用程序检查在线/离线用户firebase,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在尝试使用.info/connected path在我的android聊天应用程序中添加在线/离线功能 我在onCreate()方法中编写了以下代码 但是当我最小化应用程序超过60秒时,else部分不会执行 它只在我关闭应用程序或关闭互联网超过60秒时才起作用 如何使其工作,当应用程序位于前台时,它应将值设置为“在线”,当应用程序位于后台或被杀死时,它应将值设置为“离线”.info/connected反映了应用程序与Firebase实时数据库后端服务器的连接。虽然这可能与用户是否正在积极使用

我正在尝试使用.info/connected path在我的android聊天应用程序中添加在线/离线功能 我在onCreate()方法中编写了以下代码

但是当我最小化应用程序超过60秒时,else部分不会执行 它只在我关闭应用程序或关闭互联网超过60秒时才起作用


如何使其工作,当应用程序位于前台时,它应将值设置为“在线”,当应用程序位于后台或被杀死时,它应将值设置为“离线”

.info/connected
反映了应用程序与Firebase实时数据库后端服务器的连接。虽然这可能与用户是否正在积极使用应用程序有关,但它不是1:1映射


如果您想检测应用程序是否是后台的,有更好的方法(与Firebase无关),例如和其他方法。

使用onCreate中的“我的代码”

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        String id = user.getUid();
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Users").child(id).child("stateOnline");
        
        if (user != null){
            reference.setValue(true);
            reference.onDisconnect().setValue(false);

            reference.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot snapshot) {
                    boolean connected = snapshot.getValue(Boolean.class);
                    if (connected) {
                        // CONNECTED
                    } else {
                        // NOT CONNECTED
                    }
                }
                @Override
                public void onCancelled(DatabaseError error) {
                    System.err.println("Listener was cancelled");
                }
            });
            reference.keepSynced(true);
        }

我用两种方法解决了这个问题 首先,我们需要检测应用程序何时进入后台并返回前台,因此当应用程序进入前台时,将用户状态更新为“在线” 当应用程序转到后台时,将用户状态更新为“脱机”

我们可以通过实现LifecycleObserver类和编写以下2个方法来实现这一点

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onAppBackgrounded() {
        //App in background
        // here update user state as offline 
        
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onAppForegrounded() {
        // App in foreground
        // here update user state as online
          
    }
但这在没有互联网连接的情况下不起作用,例如:当用户在前台关闭应用程序时关闭互联网并关闭应用程序。在这种情况下,即使应用程序关闭,用户状态仍将保持在线,为解决此问题,我们还需要检查与.info/connected path的连接

connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
        listenerCon = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                boolean connected = snapshot.getValue(Boolean.class);
                if (connected) {
                    user= FirebaseDatabase.getInstance().getReference("users").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
                    user.child("state").setValue("Online");
                    user.child("state").onDisconnect().setValue(ServerValue.TIMESTAMP);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        };
        connectedRef.addValueEventListener(listenerCon);

因此,当超过60个sc没有连接时,用户状态将更新为脱机

谢谢@Frank van Puffelen,但为什么我的代码中没有执行其他部分。我在firebase文档“firebase在60秒不活动后关闭连接”中读到了这一点。因此,在调用
studentref.child(“status”).setValue(“offline”)时,应在60秒不活动后执行else部分当客户端断开连接时,这意味着它将立即重新连接。有关经过良好测试的状态系统,请参见:Hey@AhmedBasalib。有什么最新消息吗?
connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
        listenerCon = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                boolean connected = snapshot.getValue(Boolean.class);
                if (connected) {
                    user= FirebaseDatabase.getInstance().getReference("users").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
                    user.child("state").setValue("Online");
                    user.child("state").onDisconnect().setValue(ServerValue.TIMESTAMP);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        };
        connectedRef.addValueEventListener(listenerCon);