Проблемы с запуском приложения для Android во второй раз

StackOverflow https://stackoverflow.com/questions/4289364

  •  28-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

P.S.Такое же поведение при запуске в эмуляторе.

Обновить:

Я еще больше изучил свой код:

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

Используя AndEngine, необходимо переопределить onLoadScene().В этом методе вы указываете, что вы хотите видеть на экране при запуске, и метод возвращает объект Сцены.Сцена обрабатывает то, что вы видите на экране, поэтому, если вы хотите, скажем, добавить новую строку (или спрайт, или что-то еще) на экран, вы вызываете MyScene.addEntity(myLine) .Я создал основной класс activity и класс с именем 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 = 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 final, когда они не должны быть такими.

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

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

Это было полезно?

Решение

Зачем вам вообще статическое поле в вашем классе, если оно специфично для данного экземпляра?Сделайте это переменной экземпляра или около того.

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top