Почему не выполняется код инициализации моего SplashActivity? - PullRequest
0 голосов
/ 13 июня 2019

Мое приложение имеет некоторые глобальные / статические структуры данных, которые необходимо инициализировать перед отображением основного действия, поэтому я помещаю работу в метод onCreate моего SplashActivity, который просто показывает всплывающее изображение в течение 2 секунд. другое действие и заканчивает себя:

initializeGlobalData(); 

new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent i = new Intent(SplashActivity.this, MainActivity.class);
            startActivity(i);
            overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
            finish();
        }
    }, 2000);

Теперь, мое приложение иногда таинственно падает из-за нулевой ссылки на указатель - некоторые глобальные структуры данных не инициализируются. Это может означать только то, что метод OnCreate для SplashActivity не вызывается (верно?).

Понятия не имею, как это воспроизвести, но это случается довольно часто. Возможно, я оставил приложение в фоновом режиме и снова вошел. Но данные уровня приложения не должны быть выпущены, верно?

Ответы [ 3 ]

1 голос
/ 13 июня 2019

Возможно, я оставил приложение в фоновом режиме и снова вошел.Но данные уровня приложения не должны раскрываться, верно?

Это зависит от того, что вы имеете в виду, когда говорите «глобальные / статические структуры данных, которые необходимо инициализировать».

ЕслиПользователь покидает ваше приложение, ожидается, что ОС Android может завершить процесс вашего приложения.Когда это происходит, все, что хранится только в памяти, будет потеряно.

Типичным примером является, например, какое-то значение public static, которое вы загружаете один раз, а затем ссылаетесь во всем приложении.Когда ОС завершает процесс вашего приложения, а затем пользователь возвращается в ваше приложение, это значение public static необходимо будет повторно инициализировать.

1 голос
/ 13 июня 2019

Почему бы просто не инициализировать их в Application классе

public class MyApplication extends Application {

    private int globalData = 0;

    public int getGlobalData() {
        return globalData;
    }

    public void setGlobalData(int globalData) {
        this.globalData = globalData ;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        setGlobalData(100)
    }
 }

Изменить тег приложения в файле манифеста-

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:name=".MyApplication" .  // declare the application class
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

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

((MyApplication) getApplicationContext()).getGlobalData()

Ваше поведение таково, что если приложение находится в фоновом режиме, даже если оно не было закрыто, ОС Android может очистить инициализированную переменную, если она не используется.

1 голос
/ 13 июня 2019

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

...