Проблемы с запуском Android-приложения второй раз - PullRequest
2 голосов
/ 27 ноября 2010

Я новичок в Android и разрабатываю небольшую игру на основе AndEngine (www.andengine.org).

В игре отображается мозаичная карта для фона с различными типами плиток (некоторые подвижные, некоторыес возможностью поворота).Я также рисую некоторые линии на экране.

Проблема в том, что когда игра запускается впервые (запущена на телефоне, запущена из Eclipse), она запускается без ошибок, но если я выхожу из игры с помощью кнопки НАЗАД телефона и перезагружаюсьВ игре с телефона на рабочем столе значок приложения очень глючит.Линии больше не появляются на экране, а функциональность перемещения и вращения плиток работает только один раз, после чего игра не работает.Он не вылетает, но ошибки, вызванные перезапуском игры, делают его бесполезным.

Я прочитал все, что могу найти в жизненном цикле приложения, и попытался установить для различных объектов значение null в методе onDestroy (), но ничегоЯ сделал что-то изменило.Что-то явно «зависает» с первого запуска приложения и вызывает проблемы при его запуске во второй раз.Помогите, пожалуйста, 24 часа гуглить и ломать мой мозг бесполезно.

Спасибо, Стив

PS То же самое при запуске в эмуляторе.

ОБНОВЛЕНИЕ:

Я исследовал свой код дальше:

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

При использовании AndEngine необходимо переопределить onLoadScene ().В этом методе вы указываете, что вы хотите на экране при запуске, и метод возвращает объект Scene.Сцена обрабатывает то, что вы видите на экране, поэтому, если вы хотите сказать, добавить новую строку (или спрайт, или что-то еще) на экран, вы вызываете myScene.addEntity (myLine).Я создал основной класс деятельности и класс MyLine, который рисует линию.

Моя основная деятельность:

public class LineTest extends BaseGameActivity {

@Override
    public Scene onLoadScene() {
        scene = new Scene(1);
        myLine = new MyLine();
        myLine.displayLine();   
        return scene;
    }
}

Класс MyLine:

public class MyLine {

    static final Scene SCENE = LineTest.scene;
    static final int LINE_WIDTH = 4;

    Line line = new Line(0,0,0,0);

    public MyLine() {
    }

    public void displayLine() {
        line.setLineWidth(4);
        line.setColor(1f, 0f, 0f);
        line.setPosition(10, 10, 400, 400);
        SCENE.getBottomLayer().addEntity(line); 
    } 

    public void removeLine() {
        SCENE.getBottomLayer().removeEntity(line);
    }
}

Вы можетеобратите внимание на проблему с вышесказанным, в свою защиту я новичок в Java и ООП.В моей деятельности используется только одна сцена, поэтому я подумал, что в своем классе MyLine я могу объявить SCENE как статический финал, поскольку он не изменится.НЕПРАВИЛЬНО!Отладка программы Я обнаружил, что статический финальный сценарий, установленный один раз, никогда не меняется, даже после того, как программа была остановлена ​​(с помощью клавиши возврата) и перезапущена.Однако, когда программа перезапускает код Scene scene = new Scene (1);создает новую сцену с новым идентификатором, поэтому статическая конечная сцена указывает на старую сцену, а не на новую, поэтому в новой сцене не создается строка.

Я обнаружил, что для решения этой проблемы работают два параметра:

Либо:

Scene SCENE = LineTest.scene;

Или:

static Scene SCENE;

И в конструкторе:

    SCENE = LineTest.scene; //I could also pass scene as param to 
constructor which may be better OOP practice.

Я подозреваю другие мои проблемы с моим игровым приложениемвсе они связаны с объявлением вещей как static или static final, когда они не должны быть.

Есть ли эмпирическое правило, которое я могу использовать, решая, какие переменные (и методы) должны быть?

ОБНОВЛЕНИЕ: у меня было три переменные в моем классе Game, объявленные как static final, когда они должны были быть просто static.Изменение их на статическое и назначение их в конструкторе решило все проблемы, WOOHOO!{: -)

Ответы [ 4 ]

0 голосов
/ 12 октября 2012

Я тоже столкнулся с этой проблемой, и я решил ее, удалив некоторые статические переменные и статический метод.Я знаю, что статическая переменная останется в памяти при нажатии кнопки «Назад» в Android, но я до сих пор не знаю, почему эффект такой странный.Также спасибо всем выше!

0 голосов
/ 27 ноября 2010

Что-то явно «болтается» с первого запуска приложения и вызывает проблемы при его запуске во второй раз.

Вы создали свой собственный подкласс Application? Если вы выполняете некоторую инициализацию игры на уровне приложения, а затем другую инициализацию на уровне активности, то первая не будет повторяться, пока само приложение не будет убито и перезапущено. Простой выход с помощью кнопки НАЗАД не приводит к непосредственному завершению работы приложения.

0 голосов
/ 27 ноября 2010

Будьте осторожны с использованием статических конечных переменных !!! Решение моих проблем выше.

0 голосов
/ 27 ноября 2010

Почему у вас даже есть статическое поле в вашем классе, когда оно относится к экземпляру?Сделайте это переменной экземпляра или около того.

Вы также можете сбросить все статические поля вручную, когда приложение откроется, но это будет очень безобразно.

...