2013-09-28 100 views
3

我正在編寫同時具有「活動」和「服務」組件的Android應用程序。此外,我有一個封裝了一個資源的類,我在活動和服務的幾個地方共享資源。我的問題是我如何確定何時釋放資源。據我瞭解,Java沒有析構函數的概念,所以我不能只在共享對象中創建一個析構函數,當沒有更多的對象引用時將會調用它。 Android具有諸如Activity的onPause和Service的onDestroy之類的功能,儘管技術上不能保證在所有可能的關閉情況下(例如低內存殺手都不會調用這些函數)這些函數都會被調用。在任何情況下,活動都可能被銷燬而不會破壞服務,在這種情況下,仍然可能會引用該資源,所以我不能在這種情況下盲目釋放資源。由於Java沒有析構函數,因此有些源表示創建自己的「close()」類型函數並手動調用它。但似乎這樣工作,我將不得不維護自己的引用計數方案,考慮到Java已經具有GC而不需要這種方案,這似乎相當奇怪。釋放Android應用程序中的共享資源

這裏有什麼合適的解決方案?

+0

你的問題描述不清楚。請更詳細地描述共享資源的含義。是內存還是持久對象?什麼是服務器組件?它是在設備上運行的東西嗎?或在遠程位置的東西? – minhaz

+0

對不起,我的意思是在android.app.Service中的服務。共享資源是一個抽象,由各個類共享一個實例(通過持有相同的引用)和(Java)同步以阻止併發訪問的類表示。 – Michael

+0

聽起來像你來自C的世界。不需要這些類型的Java釋放內存。當沒有對象的引用時,我們有一個垃圾收集器爲我們這樣做。 – cYrixmorten

回答

2

答案是否定的。

你必須記住清理諸如自己關閉文件之類的東西,但即使是沒有進行適當清理的對象也很少會導致內存泄漏,因爲如果GC掃描時它們不能執行任何操作或佔用空間遠。除非你明確地做了一些事情來保持它的活力,否則它會。

在我看來,唯一值得關注的地方是靜態對象,調用C代碼並在類之間傳遞巨大對象。如果你做了大量的意大利麪條,循環引用,代碼,風險是GC不會收集對象,因爲仍然有對它們的引用。

只要你創建了一個有點理智的代碼,你會沒事的。 不要恐慌

+0

+1 for *不要恐慌* – andy256

0

像c#這樣的Java是一種託管語言,而不是c。它實現負責管理對象的垃圾收集。當一個對象不再需要時,它將被自動銷燬。不關心手動釋放內存。

0

Java沒有析構函數,但finalize()是他們與每個對象哪種工作像析構函數。

對於標準內存對象不用太擔心,java會自動銷燬那些未在其他類中引用的對象。這與Android和它的標準Java內容沒有任何關係。

如果你有昂貴的資源,這是昂貴的創建,你可能會想到使用serealizable在磁盤上堅持它。如果你不想堅持,你可以考慮Java引用長時間保持它的活躍。在這種情況下,您還可以考慮使用單例設計模式對昂貴的對象進行更多的控制。這些都與標準的Java垃圾收集相矛盾,其中GC銷燬未被主動引用的對象。

當您的對象從活動跳轉到活動時,請確保此類對象與任何活動保持分離,並且不保留對不可見活動的引用。由於所有這些視圖對象的活動對於Android來說太大了,以至於它們在不可見時特別隨身攜帶。

但是,舊版本的Android版本在原生圖層上分配了位圖內存,它們不會在沒有調用回收的情況下進行垃圾回收。

如果您創建綁定服務並將您的對象保留在該服務上,那麼只要活動連接保留,Android就會保持該服務的活動狀態。