首页 > 解决方案 > 如何继续搜索匹配的玩家,然后停止在 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");
                 }
             }
         }

标签: androidfirebasefirebase-realtime-database

解决方案


我怎样才能总是每秒检查人们的状态?

无需反复轮询。当您调用 时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);
             }
         }

推荐阅读