【问题标题】:Can we execute code after startActivity() before it gets paused?我们可以在 startActivity() 暂停之前执行代码吗?
【发布时间】:2012-03-26 00:47:33
【问题描述】:

我的问题是...... 如果我们尝试在 startActivity() 之后执行一些代码,我们会在调用当前 Activity 的 onPause() 之前完全执行吗?也就是说,我没有知道当包含它的方法到达末尾时是否真的会调用 startActivity()(finish() 方法会发生这种情况)。

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

【问题讨论】:

    标签: android android-activity onpause


    【解决方案1】:

    您想在调用startActivity() 的方法中执行的任何操作都会在您收到onPause() 的调用之前执行。问题是,您的应用程序默认使用一个主线程,调用onPause() 和其他生命周期方法发生在它上面。所以当这个线程忙于执行你方法中的代码时,它不能处理其他任何事情。

    如果您的方法在其他线程中执行,这只会是一个问题。然而事实并非如此,因为这个方法是用来监听 UI 事件的,所以我假设它总是从主线程调用。

    【讨论】:

    • 是的,这个方法在 UI 线程里面。我不确定对 startActivity() 的调用是否会“破坏”在该行包含它的方法,并且不会执行以下方法,因为会立即调用 onPause()。但正如你所说,情况并非如此,因此我所做的事情“是合法的”。感谢您的答复! :)
    • @Caumons 只有在所有生命周期方法调用都实际发生在对startActivity() 的调用中时才会发生。但是,情况并非如此,因此如果一切都在同一个线程中运行,则无法调用 onPause()。
    【解决方案2】:

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

    了解当我们在代码中调用 startActivity() 时,活动回调 onCreate()、onStart()、onResume() 或推入主事件队列,直到执行队列中的先前方法,因此下一个活动不会立即开始,而是将活动回调放入队列中,仅在执行当前方法后执行,即 startActivity() 之后的代码和下一个活动加载时当前活动的 onPause() 被推入队列。

    如果看活动生命周期 image link onPause 在加载另一个活动时调用

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 感谢您的回复,帮助很大!是的,我的应用程序中有多个 AsyncTask 来完成繁重的工作。 :)
      猜你喜欢
      • 2010-10-11
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2019-05-12
      • 2017-05-06
      • 1970-01-01
      相关资源
      最近更新 更多