【发布时间】: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