【问题标题】:Firebase realtime database: How to use addValueListenerFirebase 实时数据库:如何使用 addValueListener
【发布时间】:2018-10-21 16:30:55
【问题描述】:

我是 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 不会出现。设备如何检查新值何时自动添加? 我确定我误解了某些东西并犯了愚蠢的错误..我该怎么做我想做的事?

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    我有一个想法,那就是为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
        }
    });
    

    【讨论】:

    • 等等,但是当arraylist达到一个大小时,我怎样才能调用该方法呢?此外,我认为已经在 Activity 中的设备无法判断是否添加了值。所以我的意思是我不明白如何addListener
    • 在您的活动第一次开始时,监听器自动触发并将players从数据库加载到您的数组列表(您必须编写一些代码来执行此操作),这意味着现在您知道有多少玩家在房间里,无论它是否已满。然后每次有一个玩家在房间里注册,你必须检查房间是否已满。如果为真,则拒绝注册,否则允许玩家进入房间并更新数据库。更新信息也通过上述回调方法在其他设备上更新。
    • 不,addListenerForSingleValueEventaddChildListener 不同。如果使用addListenerForSingleValueEvent,您将通过snapshot 获得具有空属性的播放器。让我们尝试实现我的想法。我想你还没有尝试过。
    • 好的,我在等你!
    猜你喜欢
    • 2021-11-17
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2017-04-04
    相关资源
    最近更新 更多