2016-03-22 4 views
-1

Я пытался исправить ошибку в своем приложении уже 3 дня, без каких-либо успехов. Проблема в том, что переменная экземпляра получает магическую привязку.Переменная экземпляра получает магическое назначение в java

Приложение представляет собой многопользовательскую игру с Bluetooth, в которой игроки принимают очередь. После того, как игра окончена, отображается диалоговое окно с запросом игроков, если они хотят продолжить. Поэтому, когда игрок 1 продолжает, сообщение отправляется игроку 2, чтобы уведомить, что игрок 1 хочет продолжить. Переменная «enemyContinued» становится правдой. И когда игрок 2 клика тоже продолжит, если оппонентContinued равен true, игра перезапускается.

Проблема:

Когда будет показан диалог для обоих игроков и игрока 1 вращает экран, игрок 2 щелчки продолжаются, игрок 1 получает уведомление и «opponentContinued» получает назначенную истинным. ПОСЛЕ этого, когда игрок 1 кликает и продолжает (оппонент должен продолжаться), проверяет, истинна ли опция «forwardContinued», обнаруживает, что «enemyContinued» является ложным.

Все работает нормально, если нет вращения.

Затем, чтобы сделать это немного ясно, я сделал фиктивную переменную, чтобы отслеживать, когда и как назначается «enemyContinued», и каждый раз, когда он получил назначение, я сделал dummyBoolean равным «сопернику». Я сделал dummyBoolean true как значение по умолчанию. В методах «onContinueClicked» «dummyBoolean» является истинным, а «enemyContinued» - ложным.

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

Я понятия не имею, что может быть проблемой. Кто-нибудь испытал такую ​​проблему? Любая помощь приветствуется.

EDIT

Пожалуйста, обратите внимание, что эта проблема имеет не делать ничего с сохранением состояния во время поворота экрана. Проблема заключается в том, что переменная «enemyContined» «магически» назначается значению по умолчанию false, после того как установлено значение «true».

Я знаю, это звучит нереалистично, но это погубило меня много времени.

+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 перезапустит текущую активность (вызывается onDestroy(), а затем - onCreate()). Поведение перезапуска предназначено, чтобы помочь вашему приложению адаптироваться к новым конфигурациям, автоматически перезагружая приложение альтернативными ресурсами, которые соответствуют новой конфигурации устройства.

Для правильной обработки перезапуска важно, чтобы ваша деятельность восстанавливала прежнее состояние с помощью обычного жизненного цикла Activity, в котором Android вызывает onSaveInstanceState(), прежде чем он уничтожит вашу активность, чтобы вы могли сохранять данные о состоянии приложения. Затем можно восстановить состояние в течение OnCreate() или onRestoreInstanceState()

Ваша проблема заключается в том, что, когда пользователь поворачивает устройство, ваш объект деятельности уничтожается и новый создается на своем месте. Таким образом, значения инициализируются (повторно) во время создания нового экземпляра.Вам нужно сохранить состояние, а затем восстановить его, когда устройство повернуто.

+0

См. Редактирование. –

+0

Нет волшебства. Java инициализирует переменные (в отличие от C), а логические значения инициализируются как false. При вращении ваш объект уходит, и создается новый экземпляр вашей активности. Таким образом, поле присваивается начальное значение false. Вы можете это доказать, используя отладчик и установив точку останова в доступе поля. Кроме того, вы можете добавлять методы onSaveInstanceState(), onRestoreInstanceState(), onDestroy(), onCreate() и onResume() и конструктор для регистрации при возникновении различных частей жизненного цикла активности. Тогда вы сможете увидеть, что ваша деятельность уничтожена и воссоздана. – dsh

+0

Я знаю это, и это не проблема. Когда я поворачиваю экран, активность воссоздается, тогда логическая переменная инициализируется до начального значения. После этого игрок 2 продолжает, и игрок 1 получает сообщение, чтобы установить значение true. Значение равно true. Затем, когда игрок 1 продолжает и проверяет, истинно ли значение, но обнаруживает, что оно ложно. –

0

Значение по умолчанию логических значений в Java является ложным, поскольку переменной воссоздаетсей присваивается значение по умолчанию ложных

Проблемы активность становится воссоздана на ориентации экрана changed.you может решить эту проблему с помощью 3 способов

- .Вы можете использовать onSaveInstanceState и onRestoreInstanceState для сохранения и извлечения логическое значение

2.make вашей булевой переменной статики и объявить его вне методы управления жизненным циклом

3. Использовать общие настройки для отслеживания вашей логической переменной

+0

См. Редактирование. –

Смежные вопросы