Firebase实时数据库:如何使用addValueListener

时间:2018-10-21 07:17:58

标签: java android firebase firebase-realtime-database

我是Android编程和使用Firebase创建多人游戏的初学者。我在考虑用户如何启动游戏的逻辑。

我要做的是在用户玩游戏的房间变满时向Toast展示。但是我想知道其他设备如何判断房间是否满员。我以为addListenerForSingleValueEvent可以做到这一点,但是它没有按预期工作。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_name);

    String roomName = getIntent().getExtras().getString("ROOM_NAME");
    thisRoom = FirebaseDatabase.getInstance().getReference().child(roomName);

    thisRoom.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            //when the room gets full, start the game
            int numberOfPlayers = (int) dataSnapshot.getChildrenCount();
            if (numberOfPlayers >= 2) {
                Toast.makeText(MultiplayerStreetViewActivity.this, "Game Starts", Toast.LENGTH_LONG).show();
           //do something
            }
        }

我检查了两个模拟器是否可以正常工作。对于第一个较早开始活动的玩家,添加第二个值时不会显示Toast。设备如何检查何时自动添加新值? 我确定我误会了一些东西并犯了愚蠢的错误。我该怎么做我想做的事?

1 个答案:

答案 0 :(得分:0)

我有个主意,那就是为thisRoom添加子事件监听器,并使用本地设备上的数组列表来管理房间中的播放器。每次您添加,修改或删除房间中的播放器。侦听器将立即触发,您可以在数组列表上添加,修改或删除。因此,您可以知道房间是否已满(根据阵列列表是否已满)。

 thisRoom.addChildEventListener (new ChildEventListener(){
    public void onCancelled(DatabaseError error)
    {
        //say something to player 
    }
    public void onChildAdded(DataSnapshot snapshot, String previousChildName)
    {
        Player newPlayer = snapshot.getValue(Player.class);
        //then add newPlayer to local array list
    }
    public void  onChildChanged(DataSnapshot snapshot, String previousChildName)
    {
        Player changedPlayer = snapshot.getValue(Player.class);
        //then do something to modify info of the player in the array list 
    }
    public void  onChildMoved(DataSnapshot snapshot, String previousChildName) 
    {
       //I have no idea for this method
    }
    public void  onChildRemoved(DataSnapshot snapshot)
    {
       //remove player from your array list
    }
});