我已经尝试在我的应用程序中修复已经3天的错误,但没有成功。问题是实例变量被神奇地分配。
该应用程序是一款蓝牙多人游戏,玩家轮流使用。游戏结束后,会显示一个对话框询问玩家是否愿意继续。因此,当玩家1继续时,向玩家2发送消息以通知玩家1想要继续。变量" opponentContinued"得到了。当玩家2点击继续时,如果opponentContinued等于true,游戏将重新启动。
问题:
当向两个玩家显示对话框并且玩家1旋转屏幕时,玩家2点击继续,玩家1接收通知并且"对手继续"被指定为真。在此之后,当玩家1点击继续并且(对手继续必须为真)检查"对手是否继续"是的,发现"对手继续"是假的。
如果没有轮换,一切正常。
然后为了使它有点清楚我做了一个虚拟变量来监视何时以及如何"对手继续"获得分配,每次分配我使dummyBoolean等于" opponentContinued"。我将dummyBoolean设为true为默认值。在" onContinueClicked"方法" dummyBoolean"是真的,而#34;对手继续"是假的。
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。
我知道这听起来不切实际但却毁了我很多时间。
答案 0 :(得分:1)
https://developer.android.com/guide/topics/resources/runtime-changes.html
某些设备配置可能会在运行时更改(例如屏幕方向,键盘可用性和语言)。当发生这样的更改时,Android会重新启动正在运行的Activity(调用onDestroy(),然后调用onCreate())。重新启动行为旨在通过使用与新设备配置匹配的备用资源自动重新加载应用程序来帮助您的应用程序适应新配置。
要正确处理重新启动,您的活动必须通过正常的Activity生命周期恢复其先前的状态,在此生命周期中Android会在销毁活动之前调用onSaveInstanceState(),以便您可以保存有关应用程序状态的数据。然后,您可以在onCreate()或onRestoreInstanceState()
期间恢复状态
您的问题是,当用户旋转设备时,您的活动对象将被销毁,并在其位置创建一个新活动对象。因此,在创建新实例期间(重新)初始化值。您需要保存状态,然后在旋转设备时将其恢复。
答案 1 :(得分:0)
当你检查对手是否继续时,你应该首先要求变量内容。如果opponentContinued
为假,请将问题重复给对手的设备。
答案 2 :(得分:0)
java中boolean的默认值为false,因为正在重新创建变量,默认值为false
问题是在屏幕方向改变后重新创建活动。你可以通过3种方式解决这个问题
1.您可以使用onSaveInstanceState和onRestoreInstanceState来保存和检索布尔值
2.制作你的布尔变量static并在生命周期方法之外声明它
3.使用共享首选项来跟踪您的布尔变量