Можем ли мы выполнить код после startActivity () до того, как он будет приостановлен?

У меня вопрос ... Если мы попытаемся выполнить какой-то код после startActivity (), будет ли он полностью выполнен до вызова onPause () текущего Activity? То есть я не знаю, если 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();
}

person Caumons    schedule 08.03.2012    source источник


Ответы (3)


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

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

person Malcolm    schedule 08.03.2012
comment
Да, этот метод находится внутри потока пользовательского интерфейса. Я не был уверен, что вызов startActivity () сломает метод, содержащий его в этой строке, и следующие из них не будут выполнены, потому что onPause () будет вызван немедленно. Но, как вы говорите, это не так, и поэтому то, что я сделал, является законным. Спасибо за ваш ответ! :) - person Caumons; 08.03.2012
comment
@Caumons Это могло произойти, только если бы все вызовы методов жизненного цикла действительно происходили внутри вызова startActivity(). Однако это не так, поэтому, если все работает в одном потоке, onPause() просто не может быть вызван. - person Malcolm; 08.03.2012

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

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

person Charles Harley    schedule 08.03.2012
comment
Спасибо за ответ, это очень помогло! И да, в моем приложении есть несколько AsyncTasks для выполнения тяжелой работы. :) - person Caumons; 08.03.2012

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

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

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

person murali krish    schedule 21.07.2016