2016-03-22 41 views
-1

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

该应用程序是一个蓝牙多人游戏,其中的玩家轮流。游戏结束后,会显示一个对话框询问玩家是否愿意继续。因此,当玩家1继续时,消息被发送给玩家2以通知玩家1想要继续。变量“opponentContinued”变为true。当玩家2点击也继续时,如果opponentContinued等于true,则游戏重新开始。

问题:

当对话框显示双方的球员和球员1旋转屏幕,播放2次点击继续,播放器1接收通知和“opponentContinued”被分配为真。在此之后,当玩家1点击继续并且(对手持续必须为真)检查“对手持续”是否为真时,发现“对手持续”为假。

如果没有轮换,一切正常。

然后为了让它有点清楚,我做了一个虚拟变量来监视何时以及如何分配“对手持续”,并且每次分配时我都使dummyBoolean等于“opponentContinued”。我使dummyBoolean为默认值true。在“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 
     } 
    } 
} 

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

编辑

请注意,这个问题有什么都不做与屏幕旋转时进行省电状态。问题在于,变量“opponentContined”在设置为true之后会“神奇地”分配给默认值false。

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

+0

你应该保存变量的状态,当onPause被调用时(旋转,单击主页按钮等......) – PedroHawk

+0

问题不是关于状态。我不需要保存任何东西。 –

+0

我不得不说,PedroHawk是正确的....检查此链接http://stackoverflow.com/questions/10126845/handle-screen-rotation-without-losing-data-android –

回答

0

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

+0

问题不在于此,请参阅编辑。 –

1

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

一些设备配置可以在运行过程中改变(例如,屏幕取向,键盘可用性和语言)。当发生这种变化时,Android会重新启动正在运行的Activity(onDestroy()被调用,然后是onCreate())。重新启动行为旨在通过使用与新设备配置相匹配的备用资源自动重新加载应用程序来帮助您的应用程序适应新的配置。

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

你的问题是,当用户旋转装置,你的活动对象被破坏,新的在其位置创建。因此,这些值在新实例的创建过程中(重新)初始化。您需要保存状态,然后在设备旋转时进行恢复。在Java布尔的

+0

请参阅编辑。 –

+0

没有魔法。 Java初始化变量(与C不同),并且布尔值被初始化为false。在旋转时,对象消失,并创建一个新的活动实例。因此该字段被分配一个初始值为假的。您可以使用调试器并在字段的访问权限上设置断点来证明这一点。此外,您还可以添加onSaveInstanceState(),onRestoreInstanceState(),onDestroy(),onCreate()和onResume()方法以及构造函数来记录活动生命周期的各个部分何时发生。然后,您将能够看到您的活动已被破坏并重新创建。 – dsh

+0

我知道这并不是问题所在。当我旋转屏幕活动重新创建,然后布尔变量初始化为初始值。在该玩家2继续并且玩家1接收到将该值设置为真的消息之后。该值设置为true。然后,当玩家1继续并检查该值是否为真,但发现它是假的。 –

0

缺省值是假,因为变量被重新创建的默认值假

问题分配被活动是越来越屏幕方向重新changed.you可以通过3种方式

1解决这个。你可以利用和的onSaveInstanceState的onRestoreInstanceState保存和检索布尔值

2.make你的布尔变量和静态声明它之外的生命周期方法

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

+0

请参阅编辑。 –