实例变量在java中神奇地赋值

实例变量在java中神奇地赋值,java,android,instance-variables,Java,Android,Instance Variables,我已经尝试修复应用程序中的一个错误3天了,但没有成功。问题是实例变量被神奇地赋值 该应用程序是一款蓝牙多人游戏,玩家轮流玩。游戏结束后,会显示一个对话框,询问玩家是否愿意继续。因此,当播放器1继续时,会向播放器2发送一条消息,通知播放器1希望继续。变量“opponentContinued”变为true。当玩家2点继续时,如果opponentContinued等于true,游戏将重新开始 问题是: 当对话框同时显示给两名玩家且玩家1旋转屏幕时,玩家2单击“继续”,玩家1收到通知,“opponent

我已经尝试修复应用程序中的一个错误3天了,但没有成功。问题是实例变量被神奇地赋值

该应用程序是一款蓝牙多人游戏,玩家轮流玩。游戏结束后,会显示一个对话框,询问玩家是否愿意继续。因此,当播放器1继续时,会向播放器2发送一条消息,通知播放器1希望继续。变量“opponentContinued”变为true。当玩家2点继续时,如果opponentContinued等于true,游戏将重新开始

问题是:

当对话框同时显示给两名玩家且玩家1旋转屏幕时,玩家2单击“继续”,玩家1收到通知,“opponentContinued”被指定为true。之后,当玩家1单击“继续”并(opponentContinued必须为true)检查“opponentContinued”是否为true时,会发现“opponentContinued”为false

public class MainActivity extends Activity {

    private boolean opponentContinued;
    private boolean dummyBoolean = true;



    private void onOpponentContinued(){
        opponentContinued = true;
        dummyBoolean = opponentContinued;
    }

    private void onContinueClicked(){
        // opponentContinued is false
        // dummyBoolean is true
        if (opponentContinued){
              // Continue the game
        }
    }
}
如果没有旋转,一切正常

然后为了弄清楚一点,我制作了一个虚拟变量来监控何时以及如何分配“opponentContinued”,每次分配它时,我都将dummyBoolean设置为等于“opponentContinued”。我将dummyBoolean设置为默认值。在“onContinueClicked”方法中,“dummyBoolean”为true,“opponentContinued”为false

public class MainActivity extends Activity {

    private boolean opponentContinued;
    private boolean dummyBoolean = true;



    private void onOpponentContinued(){
        opponentContinued = true;
        dummyBoolean = opponentContinued;
    }

    private void onContinueClicked(){
        // opponentContinued is false
        // dummyBoolean is true
        if (opponentContinued){
              // Continue the game
        }
    }
}
我不知道有什么问题。有没有人经历过这样的问题?感谢您的帮助

编辑

请注意,问题与屏幕旋转期间保存状态无关。问题是变量“opponentcontinued”在设置为true后“神奇地”分配给默认值false


我知道这听起来不切实际,但它毁了我很多时间

当你检查对手是否继续时,你应该首先询问一个可变内容。如果
opponentContinued
为false,则在对手的设备上重复该问题

某些设备配置在运行时可能会更改(例如屏幕方向、键盘可用性和语言)。当发生这样的更改时,Android会重新启动正在运行的活动(调用onDestroy(),然后调用onCreate()。重新启动行为旨在通过使用与新设备配置匹配的替代资源自动重新加载应用程序,帮助应用程序适应新配置

为了正确处理重新启动,在正常的活动生命周期中,您的活动必须恢复其以前的状态,在正常的活动生命周期中,Android在销毁您的活动之前调用onSaveInstanceState(),以便您可以保存有关应用程序状态的数据。然后可以在onCreate()或onRestoreInstanceState()期间恢复状态


您的问题是,当用户旋转设备时,您的活动对象将被销毁,并在其位置创建一个新对象。因此,在创建新实例期间(重新)初始化这些值。您需要保存状态,然后在设备旋转时将其还原。

java中布尔值的默认值为false,因为重新创建变量时,默认值为false

问题是“活动”正在屏幕上重新创建,方向已更改。您可以通过3种方法解决此问题

1.您可以使用onSaveInstanceState和onRestoreInstanceState保存和检索布尔值

2.将布尔变量设置为静态,并在生命周期方法之外声明它


3.使用共享首选项跟踪布尔变量

调用onPause(旋转、单击home按钮等)时,应保存变量的状态。问题与状态无关。我不需要保存任何东西。我必须说佩德罗霍克是对的……检查这个链接@nikakurdaze你为什么这么说?设备旋转会杀死并重新创建活动,因此您肯定需要保存状态。我知道并且我正在保存和检索正确运行游戏所需的信息,但这个特定问题与屏幕旋转无关。问题是,分配的变量(opponentContinued=true)然后神奇地分配给它的默认值false。这没有魔力。Java初始化变量(与C不同),布尔值初始化为false。旋转时,对象将消失,并创建活动的新实例。因此,该字段的初始值为false。您可以通过使用调试器并在字段访问上设置断点来证明这一点。此外,您还可以添加onSaveInstanceState()、onRestoreInstanceState()、onDestroy()、onCreate()和onResume()方法以及构造函数,以便在活动生命周期的各个部分发生时进行日志记录。然后,您将能够看到您的活动被销毁并重新创建。我知道这不是问题所在。当我旋转屏幕时,活动被重新创建,然后布尔变量被初始化为初始值。之后,播放机2继续,播放机1收到一条消息,将该值设置为true。该值设置为true。然后,当播放器1继续检查该值是否为真,但发现该值为假时。您发布的代码没有证明这一点。您发布的代码说明了我们中至少有5人正在描述的问题。您还说过,只有当设备旋转时才会出现问题。使用调试器监视字段的指定时间,以发现其值何时更改。如果您希望其他人能够重现问题并帮助解决问题,也可以发布一篇文章。您可以观察到另一件事:将您的字段从
boolean
更改为
boolean
。当VM初始化它时,它将是
null
,而不是
false
。当引发NullPointerException时,您将知道您的代码没有指定true或false值。我要补充的是,这个问题与您之前的问题基本相同。