【问题标题】:Updating UI for all Users Firebase为所有用户 Firebase 更新 UI
【发布时间】:2018-10-26 01:26:12
【问题描述】:

所以现在我有了它,当我的游戏中的用户创建一个开放的游戏时,会弹出一个界面,其中包含一个加入按钮和一些关于游戏的信息,这很棒。我通过 RecyclerView 做到了这一点,并且效果很好。但是,这只会更新创建打开游戏的用户的屏幕。

我正在使用实时数据库来存储打开的游戏信息,并且该信息通过更新的界面显示。但是我怎样才能让它为该特定页面上的每个用户更新屏幕?

我将使用 Firebase 中的哪个功能来执行此类操作?我想要一个起点,我可以从那里做研究!我假设 Firebase Hosting 是我需要使用的,但我想从你们那里得到一些建议。

谢谢!

【问题讨论】:

  • 使用 onDataChange() 函数。这个链接对你有帮助firebase.google.com/docs/database/android/read-and-write
  • 我已经阅读了 onDataChange() 的描述。我目前对该功能的了解是,一旦添加或删除它就会更新信息。但是我是否也可以使用它来创建一个“实时”大厅,当添加游戏时,大厅中的每个用户都会看到一个允许他们加入该游戏的界面?
  • 当您想要触发所有玩家的更新时,您需要更改 Firebase 中的任何数据。这是完成您的任务的简单方法
  • 你能举个例子说明我需要在数据库中更改哪些数据吗?我目前已经设置好了,所以每当用户创建游戏时,数据都会添加到数据库中并显示在屏幕上,但它只显示在创建游戏屏幕的用户上。抱歉,如果我遇到困难,我只是想确保我已经足够彻底地解释了我的情况:)
  • 如果你想更新所有用户的数据,所有用户都必须监听更新数据的根目录。它不应该是确切的 root ,但它应该是该更新数据的父节点。只需添加所有用户都听的数据结构,然后更新它

标签: java android firebase interface


【解决方案1】:

我正在我们的多人游戏模式中使用 Firebase RealtimeDatabase,正如你所愿。

首先,你需要一个玩家来创建一个游戏,就像

    roomDB = FirebaseDatabase.getInstance().reference.child("Rooms").child(roomNumber)

然后设置孩子的值。

然后你需要同一个游戏室里的每个人都listen来参考数据库的变化。

您可以选择以下各项:

roomDB.addChildEventListener(...) 来听听孩子的变化。

roomDB.addListenerForSingleValueEvent(...) 只获得一次它的价值。

roomDB.addValueEventListener(...).removeEventListener(...) 之前收听它的值

我正在使用addValueEventListener 在玩家之间同步数据。它有大约 0.5~1 秒的延迟。游戏结束后记得removeEventListener

最后,仅供参考, 您可能希望看到 Transaction 类的 Firebase。这可以保证你的玩家不会同时将数据写入同一个地方。例如:确保 4 人游戏中不会有 5 人。

--- 更新 --

final DatabaseReference playersDB = FirebaseDatabase.getInstance().getReference()
            .child("Rooms") // end here if you want to listen to all rooms
            .child(roomId)  // end here if you want to listen to THIS room
            .child("Players"); // I end here because I only want players' data
playersDB.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot ds) {
         // update UI here;
         }
 }

【讨论】:

  • 太棒了,这真的很有帮助,非常感谢。使用 addChildEventListener(),它现在可以工作,以便用户都从同一个节点读取,因此如果一个用户创建游戏,他们的游戏将添加到大厅屏幕,如果第二个玩家创建游戏,则有 2 个游戏添加到大厅屏幕。但我仍然没有实时更新。我怎样才能更新屏幕,哦,说 1 秒左右,这样它就可以实时更新 UI? addChildEventListener() 应该已经这样做了吗?
  • 我已经更新了我的帖子,你应该在onDataChage 中创建脚本。通过这样做,如果数据发生变化,UI 可以在很短的延迟内更新。 childEventListener有很多方法,也许你可以试试addValueEventListener只听onDataChange()
  • 好的,谢谢你。我还没有完全让它对我有用,但我会玩弄它,看看我可以如何调整。感谢您的所有帮助!
猜你喜欢
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
相关资源
最近更新 更多