2013-05-25 59 views
2

我是否應該放棄在onStop()onDestroy()中持有的觀點和其他數據?我應該放開onStop()或onDestroy()中的視圖引用等嗎?

  • 如果我在onDestroy()版本中發佈我的應用程序的數據,它對android的內存不會很友好,我正確嗎?因爲我在onStop()之後仍然持有一些觀點。此外,它不保證被調用,我的活動無論如何都從內存中清除。
  • 如果我在onStop()中發佈它,我必須在onStart()中添加我的setContentView()等等,它不會得到onCreate(Bundle)交給的Bundle

請注意,我有一個非常大的應用程序,它由幾十個視圖組成,其中大部分是自定義的,並且由代碼而不是佈局文件添加。這很大程度上是由於我必須創建自定義尋呼機才能瀏覽頁面,因爲沒有任何內置視圖可以滿足我的目的(我試過......很難......)。

我已經通讀了所有相關的Android文檔,但我仍然沒有真正瞭解視圖層次結構Android自己保存/重新創建的內容以及我自己必須執行的操作。或者當所有這些都發生時,意味着Android從內存中刪除視圖層次結構。

更新問題:

Android的文檔這樣說:Note: Because the system retains your Activity instance in system memory when it is stopped, it's possible that you don't need to implement the onStop() and onRestart() (or even onStart() methods at all.

是否確定要堅持的一切,我爲什麼要在乎內存泄漏時,我的應用程序被停止像this文章說?如果它被破壞並重新創建,例如在屏幕旋轉後,我仍然從頭開始?

+0

即使你放手參考它還是gc的標記和掃描的工作。 gc開始釋放內存。假設你有一個位圖。你可以在onPause()中調用bitmap.recycle()。但它仍然是gc的工作,以釋放內存 – Raghunandan

+0

以獲取數據,使用Activity方法'getIntent()'來檢索當前意圖以及同樣傳入的任何額外內容。 – petey

+0

考慮一下你有每個活動的背景的情況。您從第一次活動導航到第二次。第一項活動已暫停。但不會被破壞。您的第一個活動是在後臺。在這種情況下,您可以在onResume()中加載圖像,並在onPause()中解除綁定或回收。當gc踢進它的內存時。在這種情況下,它的工作原理注意:只有當需要回收內存時,操作系統纔會在後臺銷燬活動。 – Raghunandan

回答

2
  1. 不,你沒有讓任何東西走在onStop()onDestroy()如果你只在你的活動拿着它(在非靜態字段)。當Android讓我們開始你的活動時,你的其他東西會自動拋出(與活動一起),因爲無法從任何線程到達它(這是垃圾收集器的工作方式,它沒有任何特殊之處或特定於活動)。

  2. 您所參考的文章描述了對視圖(或可繪製,或廣義上講 - 活動上下文)的引用在創建它的活動中存活的問題。既然有參考指向已經死亡的活動,它就變成了殭屍;更重要的是,它緊緊抓住了所有的領域,有效地把它們也包括在內。所以如果你有一個視圖或一個drawable,並把它放在一個靜態的領域(或者在任何其他可以在你的活動對象中存活的地方),那麼是的,你必須讓它進入相關活動的onStop()onDestroy()

  3. Android是否會破壞你的活動和內放棄呼叫onDestroy(),這意味着整個過程拍攝下來,這意味着沒有內存泄漏,可能會發生反正(他們是當地的一個進程)

獎金答案:

  1. 意見從XML文件充氣採取完全一樣多的內存,內置的代碼的。他們爲什麼要重一點?

  2. (更新,評論之後)在活動被拋棄之前,Android遍歷整個視圖層次結構,併爲每個視圖提供將其狀態(任何可調節數據)存儲到包中的機會;當重新創建視圖時,Android會再次走樹並將數據返回。這就是爲什麼當你重新創建一個活動時,視圖的狀態被保存(焦點,位置,文本字段的內容等)。觀察如何僅爲具有id的元素保存狀態(不管它們是否充氣或動態創建)。

+0

我並不是說它們比較重,只是我不知道Android如何在onStop()/ onPause()之後引用視圖-hiearchy來做一些記憶魔術。 –

+0

我會更新我的答案,然後...... :) – fdreger

+0

不幸的是,因爲看起來我不能使用onStop()或onDestroy(),因爲在它被調用之前有一個5秒的延遲。看到我的問題:http://stackoverflow.com/questions/16748916/why-is-ondestroy-called-after-onresume-when-using-back-button –

相關問題