2013-04-30 23 views
0

我試圖尋找一個明確的答案,但無法找到它,所以問它在這裏。道歉,如果這是一個問題。查看通脹緩存在活動

我的問題是Android是否將視野膨脹超出了活動的範圍?

我寫,其中有2個活動

活動A 活動B

甲只是有一個按鈕,啓動B. B具有相當複雜的佈局的示例應用程序。

B有一個視圖存根,我定時viewView的通貨膨脹(基本上呈現整個佈局)。

當我計算B的佈局膨脹需要多少時間。第一次它花了大約100ms。進一步通貨膨脹花了15-20毫秒。奇怪的部分是經過幾次迭代後,隨機B再次需要100 +毫秒來膨脹。

我也驗證了我的複雜的活動,(B)是被破壞掉了,再次創造了(因爲我打的B回來,從A再次啓動B)

我找不到在Android的代碼庫可能什麼解釋我爲什麼會發生這種情況。

有人可以告訴我這個緩存發生在哪裏。

以下是ComplexActivity onCreate和onDestroy的日誌。我使用背壓破壞活動

04-30 13:32:09.879: I/testInflation(19298): onCreate setting up content view 
04-30 13:32:09.895: I/testInflation(19298): onCreate content view set. Time took = 15 ms. 
04-30 13:32:09.895: I/testInflation(19298): onCreate inflating ui 
04-30 13:32:10.004: I/testInflation(19298): onCreate ui inflated. Time took = 108 ms. Total time into method = 123 ms. 
04-30 13:32:12.450: I/testInflation(19298): activity destroyed 
04-30 13:32:12.903: I/testInflation(19298): onCreate setting up content view 
04-30 13:32:12.911: I/testInflation(19298): onCreate content view set. Time took = 13 ms. 
04-30 13:32:12.911: I/testInflation(19298): onCreate inflating ui 
04-30 13:32:12.926: I/testInflation(19298): onCreate ui inflated. Time took = 13 ms. Total time into method = 26 ms. 
04-30 13:32:13.958: I/testInflation(19298): activity destroyed 
04-30 13:32:14.379: I/testInflation(19298): onCreate setting up content view 
04-30 13:32:14.395: I/testInflation(19298): onCreate content view set. Time took = 11 ms. 
04-30 13:32:14.395: I/testInflation(19298): onCreate inflating ui 
04-30 13:32:14.403: I/testInflation(19298): onCreate ui inflated. Time took = 11 ms. Total time into method = 22 ms. 
04-30 13:32:15.223: I/testInflation(19298): activity destroyed 
04-30 13:32:15.622: I/testInflation(19298): onCreate setting up content view 
04-30 13:32:15.637: I/testInflation(19298): onCreate content view set. Time took = 11 ms. 
04-30 13:32:15.637: I/testInflation(19298): onCreate inflating ui 
04-30 13:32:15.645: I/testInflation(19298): onCreate ui inflated. Time took = 13 ms. Total time into method = 24 ms. 
04-30 13:32:16.692: I/testInflation(19298): activity destroyed 
04-30 13:32:17.934: I/testInflation(19298): onCreate setting up content view 
04-30 13:32:17.950: I/testInflation(19298): onCreate content view set. Time took = 11 ms. 
04-30 13:32:17.950: I/testInflation(19298): onCreate inflating ui 
04-30 13:32:17.965: I/testInflation(19298): onCreate ui inflated. Time took = 18 ms. Total time into method = 30 ms. 
04-30 13:32:19.020: I/testInflation(19298): activity destroyed 
04-30 13:32:23.825: I/testInflation(19298): onCreate setting up content view 
04-30 13:32:23.833: I/testInflation(19298): onCreate content view set. Time took = 12 ms. 
04-30 13:32:23.833: I/testInflation(19298): onCreate inflating ui 
04-30 13:32:23.848: I/testInflation(19298): onCreate ui inflated. Time took = 11 ms. Total time into method = 23 ms. 
04-30 13:32:26.622: I/testInflation(19298): activity destroyed 
04-30 13:32:27.145: I/testInflation(19298): onCreate setting up content view 
04-30 13:32:27.161: I/testInflation(19298): onCreate content view set. Time took = 15 ms. 
04-30 13:32:27.161: I/testInflation(19298): onCreate inflating ui 
04-30 13:32:27.231: I/testInflation(19298): onCreate ui inflated. Time took = 69 ms. Total time into method = 85 ms. 
04-30 13:32:28.200: I/testInflation(19298): activity destroyed 
04-30 13:32:28.645: I/testInflation(19298): onCreate setting up content view 
04-30 13:32:28.661: I/testInflation(19298): onCreate content view set. Time took = 11 ms. 
04-30 13:32:28.661: I/testInflation(19298): onCreate inflating ui 
04-30 13:32:28.747: I/testInflation(19298): onCreate ui inflated. Time took = 91 ms. Total time into method = 102 ms. 
+0

@Robert感謝您修復logcat輸出。 – ReadyToLearn 2013-04-30 20:44:27

+0

當您按下後,Android不會中止您的活動,它會一直保留在內存中,直到系統內存不足,然後纔會刪除活動。如果你有一個Android4 +設備,有一種方法可以強制殺死活動人員,如果你有一個Android4 +設備, 去設置 - >開發人員選項 - >不要保留活動,並確保選中 – 2013-04-30 20:45:16

+0

@jucas即使是我檢查了Activity的onDestroy是否被調用? – ReadyToLearn 2013-04-30 20:46:29

回答

0

安卓launchMode 上的活動應該如何啓動的指令。有四種模式與Intent對象中的活動標誌(FLAG_ACTIVITY_ *常量)一起工作,以確定在調用活動來處理意圖時應該發生什麼。它們是:

「標準」

「singleTop」

「singleTask」

「singleInstance」

默認模式爲 「標準」。

一方有「standard」和「singleTop」活動,另一方面有「singleTask」和「singleInstance」活動。具有「標準」或「單個頂級」啓動模式的活動可以實例化多次。這些實例可以屬於任何任務,並且可以位於活動堆棧中的任何位置。通常,它們被啓動到調用startActivity()的任務中(除非Intent對象包含FLAG_ACTIVITY_NEW_TASK指令,在這種情況下選擇了不同的任務 - 請參閱taskAffinity屬性)。

相比之下,「singleTask」和「singleInstance」活動只能開始一項任務。它們始終處於活動堆棧的根部。而且,該設備一次只能保存一個活動實例 - 只有一個這樣的任務。

因此默認情況下它是標準的,比使用backstack中的活動更爲標準。閱讀關於android Activity堆棧。並且當活動從後面堆棧和所有時。 當你再次發起活動時,它會花更少的時間,因爲它有很多堆中的對象

根據這些文檔,當活動從堆棧中移出時...它將被銷燬。 http://developer.android.com/guide/components/tasks-and-back-stack.html

但是當你啓動它時,你的活動需要不同的時間。這是因爲系統的垃圾收集器在某個時間段運行並將分配的內存清除爲對象。因此,在啓動活動A後,您將進入ACtivity B.現在您正在按下按鈕: - 這意味着活動B將彈出堆棧並很快被銷燬。但是您正在啓動垃圾收集器運行之前的活動。這就是爲什麼它需要更少的時間

做一件事,運行System.gc()在on上銷燬....或在onPause()中寫入finish()... ur活動將花費幾乎相同的時間來充氣佈局。

+0

摧毀後活動不會消失。在這一點上沒有回退。 A-> B - >(後退,導致摧毀並將B扔掉) - > A – ReadyToLearn 2013-04-30 21:04:55

+0

我打印了這個活動的「this」指針,並且每當我再次發起活動時它總是給我新的活動。 – ReadyToLearn 2013-04-30 23:51:23

+0

其實事情是,當你從活動A開始B活動時,它將開始活動B,活動A將在後臺。 在這種情況下,如果您按下後退按鈕而不是活動B將被銷燬,並且堆棧的前一活動(即活動A)將出現在前面。 這一次它將調用活動A的onRestart()方法。 – 2013-05-01 15:51:24