繁体   English   中英

实例变量在java中神奇地分配

[英]Instance variable gets magically assigned in java

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

该应用程序是一个蓝牙多人游戏,玩家轮流进行。 游戏结束后,会显示一个对话框,询问玩家是否愿意继续。 因此,当玩家 1 继续时,会向玩家 2 发送一条消息,通知玩家 1 想要继续。 变量“opponentContinued”变为真。 并且当玩家 2 也点击继续时,如果对方继续为真,则游戏重新开始。

问题 :

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

如果没有旋转,一切正常。

然后为了更清楚一点,我创建了一个虚拟变量来监视“opponentContinued”何时以及如何被分配,每次分配时我都将 dummyBoolean 设置为等于“opponentContinued”。 我将 dummyBoolean 设为默认值。 在“onContinueClicked”方法中,“dummyBoolean”为真,而“opponentContinued”为假。

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
        }
    }
}

我不知道可能是什么问题。 有没有人遇到过这样的问题? 任何帮助表示赞赏。

编辑

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

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

https://developer.android.com/guide/topics/resources/runtime-changes.html

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

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

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

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

java 中布尔值的默认值为 false,因为正在重新创建由默认值 false 分配的变量

问题是 Activity 在屏幕方向改变时重新创建。你可以通过 3 种方法解决这个问题

1.你可以利用onSaveInstanceState和onRestoreInstanceState来保存和检索布尔值

2.使您的布尔变量静态并在生命周期方法之外声明它

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM