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
相关产品推荐
相关产品推荐

