【问题标题】:Boolean returns false when it is clearly true布尔值在明显为真时返回假
【发布时间】:2018-12-06 02:48:29
【问题描述】:

所以我的应用程序有一个超级简单的多人游戏。当玩家玩的游戏结束时,布尔值gameFinished 变为真。游戏中发生的大多数事情首先检查以确保 gameFinished 等于 false,这就是我的问题所在。游戏结束后,我的布尔值明确设置为 true,日志返回 @ 987654327@ 所以游戏一直在循环。

所以这里是获取游戏结果的方法

    private void getResults() {
    HomePage.getCurrentGameID(new HomePage.CallbackID() {
        @Override
        public void onSuccess(final String currentGameID) {
                games.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {
                        HomePage.getUserPosition(new HomePage.CallbackPosition() {
                            @Override
                            public void onSuccess(int position) {
                                if (dataSnapshot.child(currentGameID).child("gameFinished").getValue().equals(false)) {
                                    if (position == 1) {
                                        if (youWin()) {
                                            getWinner(FirebaseAuth.getInstance().getUid(), wager);
                                            Log.i("FlipCoin", dataSnapshot.child(currentGameID).child("gameFinished").getValue().toString());
                                        } else {
                                            getLoser(FirebaseAuth.getInstance().getUid(), wager);

                                        }
                                    }
                                    endGame();
                                }
                            }
                        });
                    }

对不起,那个方法有很多草率的代码。

但我那里有电话线, if (dataSnapshot.child(currentGameID).child("gameFinished").getValue().equals(false)) {

这会检查游戏是否结束,如果没有结束,那么将在游戏结束时找到赢家或输家。

但是,一旦游戏结束,并且使用此方法找到了赢家和输家,该方法就会循环并继续一遍又一遍地运行,因为它认为gameFinished等于false

我有一个endGame() 方法发生在这个getResults() 方法的末尾

    private void endGame() { HomePage.getCurrentGameID(new HomePage.CallbackID() {
        @Override
        public void onSuccess(final String currentGameID) {
            games.child(currentGameID).child("gameFinished").setValue(true);
            games.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    Log.i("FlipCoin", dataSnapshot.child(currentGameID).child("gameFinished").getValue().toString());
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });
        }
    });
}

在那个方法中,我使用这条线清楚地将gameFinished 设置为true games.child(currentGameID).child("gameFinished").setValue(true);

它反映在我的实时数据库中,看起来像这样

所以在视觉上,这是真的。而且我的 endgame() 方法中还有一条日志语句,它返回 true,因此根据日志语句,布尔值应该为真

但是我的 getResults() 方法中也有日志语句,并且该日志返回 false,即使布尔值显然是 true

谁能帮我解决这个奇怪的问题?

这显示了 logcat 如何一遍又一遍地从 false 切换到 true,这没有任何意义

【问题讨论】:

  • @RobbyCornelissen 我在游戏结束时将gameFinished 设置为true。我只希望在gameFinished 等于 false 时运行游戏,所以这就是我检查以确保它为 false 的原因。
  • 你的代码很复杂
  • @BrianHoang 都是超级简单的代码。只是其中混杂了一些变量。如果您阅读了我的帖子,一切都应该很清楚,但是如果不是,请告诉我,以便我澄清。
  • 如果你记录它,dataSnapshot.child(currentGameID).child("gameFinished").getValue() 的值是多少?这是你所期望的吗?你有没有通过调试器检查它?我不是在谈论它的字符串值 - 原始值。
  • 所以您期望 setValue() 立即完成?它是异步的 - 它不会立即完成。

标签: java android firebase firebase-realtime-database


【解决方案1】:

您正在将真值与假值进行比较。所以它返回false。像这样:

true.equals(false)

返回 false。

把你的代码改成这行代码:

if(dataSnapshot.child(currentGameID).child("gameFinished").getValue().equals(false))

到这里:

if((Boolean)dataSnapshot.child(currentGameID).child("gameFinished").getValue()) 

【讨论】:

  • 你记录了dataSnapshot.child(currentGameID).child("gameFinished").getValue()的值是多少?
  • 当它来自endGame() 方法时,它返回true,而当它来自getResults() 方法时,它返回false。我不知道为什么一旦调用了endGame(),在课堂上的任何地方都不会将它视为true
【解决方案2】:

出现问题是因为布尔“gameFinished”默认初始化为false 您需要在“gameFinished”设置为 true 后检查 getResults() 方法

【讨论】:

  • 如果我在调用getResults() 之前将gameFinished 设置为true,那么getResults() 将无法正常工作,因为它会检查以确保gameFinished 之前等于false它做任何事情。有没有其他办法解决这个问题?
  • 您可以在“gameFinished”为 false 时调用 getResults(),但在“gameFinished”设置为 true 时需要再次检查,然后调用 gameEnd(),您只需要管理好你的代码,你的逻辑清晰又好
  • 我正在用这个解决方案测试一些东西。如果有任何结果,我会告诉你的!
猜你喜欢
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 2014-12-01
  • 2021-08-09
  • 2022-10-05
  • 2020-01-05
  • 2017-12-11
相关资源
最近更新 更多