android - 如何继续搜索匹配的玩家,然后停止在 Firebase 数据库中的搜索
问题描述
我有 2 个问题。我想制作一个 firebase chatroulette 克隆应用程序,人们可以随机匹配并互相聊天。在应用程序中,我有 3 个状态等待、搜索人和与人聊天。第一个问题是我如何始终检查状态每秒有多少人?。第二个问题是我如何继续搜索,直到有一个状态为“正在搜索”的用户。
public void Search(){
count = 0;
user_dbref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()){
User user2 = dataSnapshot1.getValue(User.class);
Log.i("ID-",user2.getUser_id());
if(user2.getStatus()=="searching"){
user.setStatus("chatting");
progressDialog.cancel();
user_dbref.child(user2.getUser_id()).child("status").setValue("chatting");
user_dbref.child(user.getUser_id()).child("status").setValue("chatting");
}
}
}
解决方案
我怎样才能总是每秒检查人们的状态?
无需反复轮询。当您调用 时addValueEventListener
,Firebase 会主动持续监控该引用或查询的结果。如果有任何变化,它将通过调用onDataChange
查询/位置的更新数据立即通知您。
我怎样才能继续搜索,直到有状态为“正在搜索”的用户?
您当前的代码已经一直在监听数据,user_dbref
直到您告诉它停止。找到匹配项后,只需调用removeEventListener
对侦听器的引用即可。
一个简单的方法来做到这一点:
final ValueEventListener listener = user_dbref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()){
...
if(user2.getStatus()=="searching"){
...
user_dbref.removeEventListener(listener);
}
}
推荐阅读
- java - Hadoop Hdfs DFSAdmin - 无法初始化集群或 hdfs 指向 file:/// 而不是 hdfs://
- javascript - Django,如何对 JsonResponse 进行分页?
- c# - 在实体框架中处理嵌套对象
- typescript - 创建基于键推断泛型的记录类型
- apache - Htaccess 将从一个文件夹访问的文件重定向到另一个文件夹
- amazon-web-services - AWS 关于实例创建的问题
- javascript - React js没有正确显示计数器和按钮
- vega-lite - 如何在不同颜色的饼图中显示聚合总和值?
- mysql - 传递 0 秒字符串并从该值中减去时,如何避免 MYSQL CONVERT() 方法出错?
- angular - NG0200:在 DI 中检测到 InjectionToken HTTP_INTERCEPTORS 的循环依赖