Android устанавливает нулевые переменные / глобальные переменные, не оставляя активной активности - PullRequest
2 голосов
/ 01 марта 2011

Целевая платформа версии 7
Происходит время от времени, но регулярно, на многих устройствах.
Возможно, что это происходит чаще в 2.1
Аналитика сообщает об ошибке, но последующие версии сузили ее до одной конкретной проблемы.
Я создаю диалоги, используя код, очень похожий на тот, что найден здесь.

Привет, у меня странная, но очень серьезная проблема. В моем приложении (игре) я создаю пользовательские диалоги, чтобы информировать пользователя о различных событиях. Я использую showDialog (int) для этого, а не showDialog (int, Bundle), добавленный в версии 8. Эти диалоги ссылаются на объекты, созданные в действии, для отображения данных. После вызова onCreateDialog объекты теперь обнуляются, что приводит к принудительному закрытию устройства. Моя гипотеза состоит в том, что запуск диалога - это как запуск действия: если андроиду нужна память, он очистит память от вызывающего действия.

Подробнее:

1: Это не тот случай, когда мой код устанавливает объект в null, потому что A: На него ссылаются повсюду, и у него есть несколько возможностей выбросить нулевой указатель перед созданием диалога. Я также сообщил значение непосредственно перед моим вызовом showDialog (). B: он никогда не устанавливается в ноль, за исключением того, что он не имеет значения по умолчанию. C: Попытка сообщить значения других переменных, которые не равны нулю во время исключения, показывает, что они тоже равны нулю. Например: Ссылка на строку, которая никогда не равна нулю и которая не полезна для createDialog, показывает, что она также равна нулю. Однако он также не имеет значения по умолчанию. Значения по умолчанию мне не помогут, потому что тогда диалоги будут неправильными.

2: приложение использует значительный объем памяти, но я должен быть в разумных пределах.

3: Некоторые диалоги в игре более подвержены этой проблеме, но это происходило в других действиях, кроме основного, «тяжелого», хотя и очень редко.

Код выглядит примерно так, я перефразирую поток, хотя фактическая активность составляет около тысячи строк:

Class DataStructure {
    String ID;
    String Description;
    String name;
    boolean hasSpace;
    //initialize based on XML
}


Class Main extends Activity etc etc{<br>
DataStructure selectedData;



onClick{
    if(gameState == 1){
        selectedData = constructSelectedData();
        if(selectedData == null){
        //report error. Never happens.
        }
    }else if (gameState == 2){
    if(selectedData == null){
        //report error, never happens.
    }
     showDialog(5);
  }


onCreateDialog(int dialogDesired){

    if(dialogDesired == 5){
        if(selectedDialog.hasSpace){//NULL POINTER HERE REGARDLESS OF VARIABLES  REFERENCED.


    //set up dialog using typical builder model

   }

    }
}

Редактировать: трассировка стека

Вызывается: java.lang.NullPointerException в com.company.game.activity.GameMainMenuActivity.onCreateDialog (GameMainMenuActivity.java:1521) на android.app.Activity.onCreateDialog (Activity.java:2472) на android.app.Activity.createDialog (Activity.java:881) на android.app.Activity.restoreManagedDialogs (Activity.java:870) на android.app.Activity.performRestoreInstanceState (Activity.java:816) на android.app.Instrumentation.callActivityOnRestoreInstanceState (Instrumentation.java:1096) atroid.app.ActivityThread.performLaunchActivity (ActivityThread.java:2715)

Несколько замечаний о трассировке стека: кажется, что он восстанавливает активность, что странно, потому что она никуда не делась. Я могу нажать кнопку «Домой» вне действия, пока там есть диалог или он будет создан просто отлично. Фактически, как часть GameMainMenuActivity, игра восстанавливается после восстановления. Ошибка также достаточно распространена, так что крайне маловероятно, что это случай, когда пользователь просматривает игру из игры в определенном месте. Я получаю десятки таких сообщений в день.

...