Можем ли мы выполнить код после startActivity () до его приостановки? - PullRequest
1 голос
/ 08 марта 2012

У меня вопрос ... Если мы попытаемся выполнить некоторый код после startActivity (), будет ли он полностью выполнен до вызова onPause () текущей активности? То есть я не знаюесли startActivity () действительно будет вызвано, когда метод, содержащий его, достигнет конца (что происходит с методом finish()).

У меня есть пример, в котором я хочу detach() объект (который имеет подключение к базе данных) после запуска нового действия на основе некоторых условий, но мне нужен этот объект для оценки одного условия.Я знаю, что могу проверить это условие и сохранить логическое значение и detach() перед первым if, но я хотел бы знать, является ли следующий код "допустимым".

Спасибо!

protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    School selectedSchool = new School((Cursor)l.getItemAtPosition(position));
    mSharedPreferences.edit()
    .putLong(DatabaseManager.SCHOOL_ID, selectedSchool.getIdOpenErp())
    .commit();
    School.SchoolManager schoolManager = new School.SchoolManager(this);
    Long[] sessionIdsOpenErpOfSelectedSchool = schoolManager.getSessionIdsOpenErp(selectedSchool);
    if (sessionIdsOpenErpOfSelectedSchool.length > 0) {
        if (schoolManager.isPreviousWorkingSchoolPresent()) { // line 10
            Intent iParticipationManagement = new Intent(this, ParticipationManagement.class);
            startActivity(iParticipationManagement);
        } else {
            Intent iSelectExistingSession = new Intent(this, SelectExistingSession.class);
            startActivity(iSelectExistingSession);
        }
    } else {
        Intent iSelectNewSession = new Intent(this, SelectNewSession.class);
        startActivity(iSelectNewSession);
    }
    // The following line will be executed after one of the startActivity() methods is called...
    // Is this legal? Or should I get the value from isPreviousWorkingSchoolPresent() (at line 10)
    // before the first if and do the detach() there as well?
    schoolManager.detach();
}

Ответы [ 3 ]

4 голосов
/ 08 марта 2012

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

Это будет проблемой только в том случае, если ваш метод будет выполнен в каком-то другом потоке.Однако это не так, поскольку этот метод используется для прослушивания событий пользовательского интерфейса, поэтому я предполагаю, что он всегда вызывается из основного потока.

2 голосов
/ 08 марта 2012

Быстрый просмотр источника Android показывает, что если ваш код выполняется в главном потоке событий (что в вашем случае выглядит как истина), то да, он завершит выполнение до вызова onPause ().

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

0 голосов
/ 21 июля 2016

Основной цикл событий, т. Е. Поток пользовательского интерфейса обрабатывает не только сенсорные события, но и обратные вызовы жизненного цикла действия , когда начинается новое действие, обратные вызовы жизненного цикла действия onCreate (), onStart (), onResume ( ) добавляются в очередь событий в ожидании своей очереди; сенсорные события также добавляются в ту же очередь событий, и весь код выполняется в одном основном потоке.

Поймите, что когда мы вызываем startActivity () в коде, обратные вызовы операций onCreate (), onStart (), onResume () или помещаются в основную очередь событий , и они не выполняются до тех пор, пока предыдущие методы в очереди выполняются, поэтому следующее действие не начинается немедленно, а помещает обратные вызовы активности в очередь, которые выполняются только после выполнения текущего метода, то есть кода после startActivity () и при загрузке следующего действия, onPause () текущего действия помещается в очередь.

Если вы посмотрите на жизненный цикл деятельности ссылка на изображение onPause вызывается при загрузке другого действия

...