Firebase 实时数据库与 Android Java 的竞争条件问题

问题描述 投票:0回答:1

我想首先这个问题不会影响我的 iOS 应用程序,并且严格在 Android 中使用 java。

下面是我的代码:

第一个函数调用 Firebase 来获取池中的用户:

private void getPlayerCount() {

    playerInPoolQuery = playerInPoolReference.child(poolIf).orderByValue().equalTo(true);

    readPlayerCountData(playerInPoolQuery, new PicksActivity.AllPicksPlayerCountCallback() {

        @Override
        public void onSuccess(DataSnapshot dataSnapshot) {

            int playerIndex = 0;

            // Determine the number of players in the pool
            numPlayersInPool = (int) dataSnapshot.getChildrenCount();

            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {


                String userId = snapshot.getKey();

                setPlayerUsername(userId, playerIndex);


                playerIndex = playerIndex + 1;

            }

        }

    });

}

以下是获取玩家用户名的代码:

private void setPlayerUsername(final String userId, final int playerIndex) {

    userQuery = userReference.child(userId).child("username");

    readPlayerUsernameData(userQuery, new SurvivorAllPicksActivity.AllPicksPlayerUsernameCallback() {

        @Override
        public void onSuccess(DataSnapshot dataSnapshot) {

            String username = (String) dataSnapshot.getValue();

            AllPicks player = new AllPicks(username);
            //
            playerList.add(player);

            for (int i = 1; i <= currWeek; i++) {

                setPlayerPicks(userId, playerIndex, i);

            }

        }

    });

}

所以这就是问题开始的地方:

在上面的代码中,

getPlayerCount
函数检索 Firebase 分配的用户 ID 作为示例:

0yV3uJZAoDWCZNHuRgxrUlKYFgz1
1q4mOwYUKRgRi3QiC8nLAeVy1T62
425HgyfcpXf1OuA4ndTmry24Kij1
4BCIjoreBuRTNtYIOFZLRKxvk0b2
6TIHOsFuXFQ0v6yBpUn3kVqeHDE3
LNeNupya7GcwsZkd44yV22DNU6f1
M7wxpkSMb4R8rmlvo2A7OyqmLzJ2
UnVFJ49IgTYeNGsV9b0aznhV79B3
bGGtRR18jLe14EcXelgiWbHxi5p2
cU5j1txJyZgwSqsQ72T8pfn30oJ2
lDCzcnZToxMw3iTpMvJ988sJMug2
lvqWVfIpexb7n2DtoPwfVWcYpur2
nnr5ahZHKJfb0vn37eMI5oznyD23
o3Aag8bK29WoU4Aa013dYga3HgB3
q5WNLNjiVrcml4gMbu2ovMU4hyZ2
qnxtPKTVMZRTXurDOvE6aJRhH2o2

上面的工作原理完全符合我的预期,因为它是池中按字母顺序排列的玩家内部 id 的实际顺序(firebase 实时数据库如何内部组织/列出节点)

现在这是我遇到问题的地方(这似乎是竞争条件)。

当 get setPlayerUsername

function
被调用时,其执行顺序
skews
基于登录到应用程序的玩家。

我的意思是,如果具有内部标识符

bGGtRR18jLe14EcXelgiWbHxi5p2
的玩家登录,他们将
execute faster
比示例中提供的列表的顺序,并且
breaks
我的索引按字面意思加一,并且倾斜所有内容自登录玩家
jumps
以来按预期顺序排列一个位置/索引的玩家信息。

任何用户都会遇到这种情况,因此如果玩家

M7wxpkSMb4R8rmlvo2A7OyqmLzJ2
已登录,那么他们将被第二个索引并扭曲所有玩家结果。

实际上是除了上面列表中的前两名玩家之外的任何人: 0yV3uJZAoDWCZNHRgxrUlKYFgz1 1q4mOwYUKRgRi3QiC8nLAeVy1T62

当他们登录并查看玩家时,信息 100% 准确,因为索引是按正确顺序执行的!?

有谁对我如何解决这个问题有任何解决方案...我无法自己解决!!

java android firebase firebase-realtime-database
1个回答
0
投票

Java 的继承机制是一个基本概念,它允许基于现有类创建新类。它允许一个类(称为子类或子类)继承另一个类(超类或父类)的属性和行为(字段、方法)。这促进了代码重用、模块化和可扩展性。 Java中的继承是单继承,这意味着每个类只能直接从一个超类继承。但是,一个类可以通过超类的层次结构间接从多个类继承,这一概念称为多级继承。接口是 Java 的另一个特性,它为方法提供了一种多重继承的形式,允许一个类实现多个接口。通过继承,Java 支持多态性,使不同类的对象能够被视为公共超类的实例。

块引用

© www.soinside.com 2019 - 2024. All rights reserved.