Android 我们可以在startActivity()之后暂停之前执行代码吗?
我的问题是如果我们尝试在startActivity()之后执行一些代码,那么在调用当前活动的onPause()之前是否会完全执行这些代码?也就是说,我不知道当包含startActivity()的方法到达末尾时,是否会实际调用startActivity()(Android 我们可以在startActivity()之后暂停之前执行代码吗?,android,android-activity,onpause,Android,Android Activity,Onpause,我的问题是如果我们尝试在startActivity()之后执行一些代码,那么在调用当前活动的onPause()之前是否会完全执行这些代码?也就是说,我不知道当包含startActivity()的方法到达末尾时,是否会实际调用startActivity()(finish()方法) 我有一个例子,其中我想在基于某些条件启动新活动后detach()一个对象(具有数据库连接),但我需要这个对象来计算一个条件。我知道我可以检查该条件并将布尔值存储在第一个if之前,但我想知道以下代码是否“合法” 谢谢 pr
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()会被推送到队列中 如果你看看活动的生命周期
加载另一个活动时调用onPauseYes,此方法位于UI线程内。我不确定对startActivity()的调用是否会“中断”该行中包含它的方法,并且不会执行以下操作,因为onPause()会立即被调用。但正如你所说,情况并非如此,因此我所做的“是合法的”。谢谢您的回复!:)@Caumons只有当所有生命周期方法调用实际上都发生在对
startActivity()
的调用中时,才会发生这种情况。但是,情况并非如此,因此,如果所有操作都从同一个线程运行,onPause()
就是无法调用。感谢您的回复,它帮助了很多!是的,我的应用程序中有多个异步任务来完成繁重的工作。:)