我如何保持状态';在线';在android中

我如何保持状态';在线';在android中,android,firebase,android-activity,lifecycle,Android,Firebase,Android Activity,Lifecycle,现在,我正在尝试使用firebase制作一个类似instagram的聊天程序 问题是我想显示成员登录状态 但安卓的生命周期是个问题 这是我的家庭活动代码 用户登录成功后,转到HomeActivty 从这里我决定了在线还是离线 这是我区分在线和离线的代码 private void status(String status){ reference = FirebaseDatabase.getInstance().getReference("Users").

现在,我正在尝试使用firebase制作一个类似instagram的聊天程序 问题是我想显示成员登录状态 但安卓的生命周期是个问题

这是我的家庭活动代码 用户登录成功后,转到HomeActivty 从这里我决定了在线还是离线

这是我区分在线和离线的代码

    private void status(String status){
        reference = FirebaseDatabase.getInstance().getReference("Users").child(firebaseUser.getUid());

        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("status", status);

        reference.updateChildren(hashMap);

    }

    @Override
    protected void onResume() {
        super.onResume();
        status("online");
    }


    @Override
    protected void onPause() {
        super.onPause();
        status("offline");
    }

我认为这与活动的生命周期有关


如何保持状态?

在Glide尝试加载图像时,问题看起来像是您的
聊天活动被破坏了。您可以使用
getApplicationContext()
获取当前上下文。 试图取代

Glide.with(ChatsActivity.this).load(user.getImageurl())到(image\u profile)中;

Glide.with(getApplicationContext()).load(user.getImageurl()).into(image\u profile);
此外,还应使用firebase提供的
.onDisconnect()
方法检查用户是否存在

建立onDisconnect()操作时,该操作位于Firebase实时数据库服务器上。服务器会检查安全性以确保用户可以执行请求的写入事件,并在应用程序无效时通知用户。然后服务器监视连接。如果在任何时候连接超时,或实时数据库客户端主动关闭连接,服务器将再次检查安全性(以确保操作仍然有效),然后调用该事件


您可以从此

中找到更多信息将此依赖项放入您的
build.gradle
文件中:

implementation "android.arch.lifecycle:extensions:*"
然后在应用程序类中,使用以下命令:

public class MyApplication extends Application implements LifecycleObserver {

    @Override
    public void onCreate() {
        super.onCreate();
        ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    private void onAppBackgrounded() {
        Log.d("MyApp", "App in background");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    private void onAppForegrounded() {
        Log.d("MyApp", "App in foreground");
    }
}
  @Override
    protected void onStart() {
        super.onStart();
        myRef.child(uid).child("isOnline").setValue(true);
        myRef.child(uid).child("isOnline").onDisconnect().setValue(false);
    }
更新您的AndroidManifest.xml文件:

<application
    android:name=".MyApplication"
    ....>
</application>

无论用户何时在您的应用程序中,从技术上讲,他都是在线的。因此,在您的家庭活动中,请使用以下方法:

public class MyApplication extends Application implements LifecycleObserver {

    @Override
    public void onCreate() {
        super.onCreate();
        ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    private void onAppBackgrounded() {
        Log.d("MyApp", "App in background");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    private void onAppForegrounded() {
        Log.d("MyApp", "App in foreground");
    }
}
  @Override
    protected void onStart() {
        super.onStart();
        myRef.child(uid).child("isOnline").setValue(true);
        myRef.child(uid).child("isOnline").onDisconnect().setValue(false);
    }
我还建议添加到override onResume():


确保添加if语句以检查用户是否连接到internet

在哪一行代码中会出现错误?
    @Override
    protected void onResume() {
        super.onResume();
            myRef.child(uid).child("isOnline").setValue(true); //User back online

        }