You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Realtime Database无法查看其他在线成员及状态更新异常求助

1. 仅显示自己、返回后状态离线问题修复

  • 首先添加RTDB断开自动清除逻辑,避免异常退出后节点残留,在你初始化locations引用后添加如下代码:
String currentUid = FirebaseAuth.getInstance().getCurrentUser().getUid();
locations.child(currentUid).onDisconnect().removeValue();
  • 把updateList()方法和displayLocation()方法的调用放到MainActivity的onResume生命周期中,你当前只在首次启动时调用了这两个方法,从listOnline页返回后没有重新触发状态同步和适配器监听,导致状态不更新。
  • 检查counterRef的引用路径是否正确,必须指向所有在线用户的父节点,不要误指向当前用户的单独子节点,否则只能读到自己的数据。

2. 用户名显示报错修复

你当前的Tracking类没有补全字段的getter方法,Firebase序列化/反序列化时无法读取对应字段,就会抛出空值异常,给Tracking类补全所有字段的getter即可:

public class Tracking {
    private String mEmail,lat,lng,userName;

    public Tracking() {
    }

    public Tracking(String email, String uid, String lat, String lng,String userName) {
        this.mEmail = email;
        this.lat = lat;
        this.lng = lng;
        this.userName = userName;
    }

    // 补全以下getter方法
    public String getmEmail() {
        return mEmail;
    }

    public String getLat() {
        return lat;
    }

    public String getLng() {
        return lng;
    }

    public String getUserName() {
        return userName;
    }
}

同时确认你的User类的字段名、getter方法和Tracking类完全一致,避免序列化不匹配。

3. 性别年龄筛选实现示例

你的性别、年龄字段存储在Firestore,可先拉取RTDB的在线用户uid列表,再到Firestore做条件筛选,示例代码如下:

// 先监听RTDB获取所有在线用户的uid
locations.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        List<String> onlineUidList = new ArrayList<>();
        for (DataSnapshot userSnapshot : snapshot.getChildren()) {
            onlineUidList.add(userSnapshot.getKey());
        }
        // 筛选条件示例:在线、性别为男、年龄在18-25岁区间
        FirebaseFirestore.getInstance().collection("users")
                .whereIn("uid", onlineUidList)
                .whereEqualTo("gender", "男")
                .whereGreaterThanOrEqualTo("age", 18)
                .whereLessThanOrEqualTo("age", 25)
                .get()
                .addOnSuccessListener(queryDocumentSnapshots -> {
                    List<User> filteredUserList = queryDocumentSnapshots.toObjects(User.class);
                    // 将筛选后的列表传给你的列表适配器更新UI即可
                });
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        // 异常处理逻辑
    }
});

内容的提问来源于stack exchange,提问作者Grace Van

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 07:57:02