2013-07-11 52 views
4

我有一些代碼在我開始android活動時運行。如果需要,我會從共享首選項和Web服務器讀取。其中一些會發生在主線程上,顯然服務器請求是在AsyncTask中。暫停android活動時執行字節碼會發生什麼?

現在我想知道的是,如果應用程序暫停,會發生什麼情況。字節碼停止在程序計數器的哪個位置,或者等待主循環中發生的任何事情完成並調用onPause。

此外,我擔心包括從網絡接收數據時發生的回調會發生什麼。從暫停恢復後是否會發生回調,還是會一直丟失?據我瞭解,從網絡讀取的線程仍然可以在活動暫停時運行。

回答

3

好吧,我已經做了一些實驗,並對Android的源代碼進行了一次活動,現在我有點清楚了。

事情,我已發現:

  1. 的onPause,的onResume,在onStart,的onCreate等所有運行相同的線程內(通過打印Thread.currentThread.getId()),其是主要的事件線程,並且該單一事件線程用於用於所有活動(除非您在清單中分配了新流程)。這並不是完全意想不到的,但我想知道,例如onPause是否可能存在於系統啓動的線程中,用於停止活動。

  2. 如果您在代碼中有一段時間(例如在onResume中或者在按下按鈕時執行的代碼中),那麼onPause和其餘部分將不會執行。此外,該循環將繼續執行,例如,可以通過每秒打印到日誌來看到。如果您要進入主屏幕(或其他任何應該生成onPause甚至onStop的內容),這些打印仍會發生,並且儘管應用程序不可見,循環仍會繼續。你仍然會進入主屏幕。如果你想要的話,你可以回到你的應用程序,它仍然會陷入其循環。因此,當文檔談到暫停或停止活動的動作時,顯然這不會停止應用程序的執行,或者在主線程中(在調用onPause之前)或其他任何事情生成運行時異常。暫停和查殺活動與所看到的linux進程中的概念完全不相關。

  3. 如果我在AsyncTask中運行的Web請求很慢,那麼asynctask代碼將運行在不同的線程中,就像您期望的那樣。如果開始任務的活動在任務完成之前得到暫停,並且onPause,onStop被調用爲正常,那麼當asynctask完成它的回調(在Activity中定義)時,onPostExecute仍然會被調用並執行,在main gUI線程。儘管「活動」已經徹底停止,

我由此得出結論是,所有的onStop和在onStart等僅僅是事件的主要事件循環,就像任何其他的,必須等待輪到自己在主線程中調用。它們沒有什麼特別之處,不會立即執行或者類似的東西,並且可以被循環中的其他任何東西阻塞。

此外,活動的概念實際上只是一個GUI的事情,如果一個活動停止,沒有屏幕或按鈕來與之交互或顯示內容。但是,這不會影響到底層進程,這些進程將繼續保持活動狀態,並可以打印或響應回調等.JVM繼續運行,其所有類繼續存在,並繼續執行。顯然它應該沒有做任何事情,儘管如果沒有收到來自GUI的任何事件或交互並且已經收到onPause。如果它確實存在任何形式的資源,那麼這個過程當然可以關閉 - 這就是爲什麼你應該實現生命週期回調。

順便說一句,我們可以看到Activity.java,暫停發生通過調用

final void performPause() { 
     mFragments.dispatchPause(); 
     mCalled = false; 
     onPause(); 
     mResumed = false; 

然後

protected void onPause() { 
     if (DEBUG_LIFECYCLE) Slog.v(TAG, "onPause " + this); 
     getApplication().dispatchActivityPaused(this); 
     mCalled = true; 
    } 

這表明從測試預期,暫停其實只是調度另一個事件到主循環。

我認爲mCalled變量有兩個用途 - 一個用於確保在您的Activity派生類中調用super()版本,另一個用於在銷燬需要資源的進程之前檢查它是否被調用。

考慮如何工作的,如果在onPause正在緩慢的,或已被阻止別人在偶數循環的東西,它可以在onPause完成之前,你的進程就會被殺死的情況。

明顯一些,這可能是很明顯的一些人。但是我發現文檔很混亂。我無法理解我的代碼可能會進入的狀態,而不理解運行,暫停等概念對代碼排序的實際意義,因爲我認爲暫停可能意味着任何gui線程正在執行的運行時異常。

如果我已經完全誤解了這一點,並得到了錯誤的想法,請不要讓我知道!我只用了2.5周的Android,很可能我很困惑!

相關問題