2012-03-08 112 views
1

我的問題是... 如果我們嘗試在startActivity()之後執行一些代碼,它會在調用當前Activity的onPause()之前完全執行嗎?也就是說,我不知道當包含它的方法到達結尾時(如果使用方法finish()),startActivity()實際上會被調用。我們可以在startActivity()暫停之前執行代碼嗎?

我有一個例子,我想要在基於某些條件啓動一個新Activity之後創建一個具有數據庫連接的對象detach(),但我需要此對象來評估一個條件。我知道我可以檢查該條件並將其存儲在第一個if之前的布爾值和detach(),但我想知道下面的代碼是否是「合法」的。

謝謝!

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(); 
} 

回答

4

Anyhting將得到執行。事情是,你的應用程序默認使用一個主線程,調用onPause()和其他生命週期方法發生在它上面。所以,當這個線程忙於在你的方法中執行代碼時,它不能處理其他任何東西。

這隻會是一個問題,如果你的方法在其他線程中執行。但事實並非如此,因爲此方法用於偵聽UI事件,所以我假設它始終從主線程調用。

+0

是的,這個方法在UI線程裏面。我不確定對startActivity()的調用是否會「中斷」包含它的方法,並且由於onPause()會立即調用,因此不會執行下面的方法。但正如你所說,事實並非如此,因此我所做的「合法」。感謝您的答覆! :) – Caumons 2012-03-08 15:11:01

+0

@Caumons只有當所有的生命週期方法調用實際發生在調用'startActivity()'的時候纔會發生。但是,情況並非如此,因此如果所有內容都來自同一個線程,則不能調用「onPause()」。 – Malcolm 2012-03-08 15:20:22

2

就讓我們來看看通過Android源表明,如果你的代碼是在主事件線程上執行(這看起來是在你的情況真)則是它將完成()的onPause之前執行被調用。

但是,我建議不要執行可能需要幾毫秒才能完成的代碼,因爲這可能會影響應用程序在轉換到下一個活動時的響應能力。您收到onPause()呼叫之前,你想在呼叫的方法執行到startActivity()

+0

感謝您的迴應被調用時,它已經幫助了很多!是的,我在我的應用程序中有多個AsyncTasks來完成繁重的工作。 :) – Caumons 2012-03-08 15:13:27

0

主要事件循環即UI線程處理不僅觸摸事件,但也增加了活動的生命週期回調,當一個新的活動開始了活動的生命週期回調的onCreate(),在onStart()的onResume()到等待輪到它的事件隊列,觸摸事件也被添加到相同的事件隊列中,並且所有代碼都在單個主線程中執行。

明白,當我們調用startActivity()中的代碼,活動回調的onCreate(),在onStart()的onResume()或推到主事件隊列,他們不執行,直到前面的方法隊列被執行,所以下一個活動不會立即開始,而是將活動回調放入只在執行當前方法後執行的隊列中,即在startActivity()之後的代碼和下一個活動加載onPause()的當前活動被推入隊列中。

如果你看一下活動的生命週期 image link的onPause當另一個活動被載入

相關問題