Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我们可以在startActivity()之后暂停之前执行代码吗?_Android_Android Activity_Onpause - Fatal编程技术网

Android 我们可以在startActivity()之后暂停之前执行代码吗?

Android 我们可以在startActivity()之后暂停之前执行代码吗?,android,android-activity,onpause,Android,Android Activity,Onpause,我的问题是如果我们尝试在startActivity()之后执行一些代码,那么在调用当前活动的onPause()之前是否会完全执行这些代码?也就是说,我不知道当包含startActivity()的方法到达末尾时,是否会实际调用startActivity()(finish()方法) 我有一个例子,其中我想在基于某些条件启动新活动后detach()一个对象(具有数据库连接),但我需要这个对象来计算一个条件。我知道我可以检查该条件并将布尔值存储在第一个if之前,但我想知道以下代码是否“合法” 谢谢 pr

我的问题是如果我们尝试在startActivity()之后执行一些代码,那么在调用当前活动的onPause()之前是否会完全执行这些代码?也就是说,我不知道当包含startActivity()的方法到达末尾时,是否会实际调用startActivity()(
finish()
方法)

我有一个例子,其中我想在基于某些条件启动新活动后
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();
}

快速浏览Android源代码表明,如果您的代码在主事件线程上执行(在您的情况下,这看起来是真的),那么它将在调用onPause()之前完成执行


但是,我建议不要执行可能需要几毫秒才能完成的代码,因为这可能会影响应用程序在过渡到下一个活动时的响应。

通过调用
startActivity()在方法中执行的任何内容
将在您收到对
onPause()的调用之前执行。
。问题是,默认情况下,应用程序使用一个主线程,调用
onPause()
,并在其上执行其他生命周期方法。因此,当此线程忙于执行方法中的代码时,它无法处理任何其他内容


只有当您的方法在其他线程中执行时,这才是一个问题。然而,情况并非如此,因为此方法用于侦听UI事件,所以我假设它总是从主线程调用。

主事件循环,即UI线程不仅处理触摸事件,还处理活动生命周期回调,当启动新活动时,活动生命周期回调onCreate(),onStart()、onResume()被添加到等待轮到它们的事件队列中。触摸事件也被添加到同一事件队列中,所有代码都在单个主线程中执行

请理解,当我们在代码中调用startActivity()时,活动回调onCreate()、onStart()、onResume()或推入到主事件队列,并且在执行队列中以前的方法之前,它们不会执行,因此,下一个活动不会立即启动,而是将活动回调放在队列中,该队列仅在执行当前方法后执行,即startActivity()之后的代码,并且当加载下一个活动时,当前活动的onPause()会被推送到队列中

如果你看看活动的生命周期
加载另一个活动时调用onPause

Yes,此方法位于UI线程内。我不确定对startActivity()的调用是否会“中断”该行中包含它的方法,并且不会执行以下操作,因为onPause()会立即被调用。但正如你所说,情况并非如此,因此我所做的“是合法的”。谢谢您的回复!:)@Caumons只有当所有生命周期方法调用实际上都发生在对
startActivity()
的调用中时,才会发生这种情况。但是,情况并非如此,因此,如果所有操作都从同一个线程运行,
onPause()
就是无法调用。感谢您的回复,它帮助了很多!是的,我的应用程序中有多个异步任务来完成繁重的工作。:)