2011-02-24 87 views
1

我已經寫了一個地圖應用程序,可以使用谷歌地圖或開放街道地圖 作爲瓷磚供應商。 Google和OSM地圖顯示在單獨的活動中。在啓動屏幕後,輸入選擇模式活動。用戶可以通過此屏幕 通過按鈕選擇Google或OSM活動。爲什麼我的代碼在切換活動時泄漏?

我希望能夠通過每個映射活動中的按鈕在Google和OSM之間切換。當我的代碼爲每個映射活動的點擊處理,我在每個:

i = new Intent("com.me.otheractivity"); 
finish(); 
startActivity(i); 

我沒有服務連接,或覆蓋等在代碼的任何地方內部類。 當我從Select-> Google-> Select(通過後退按鈕) - > OSM遍歷時,所有分配堆的 都沒問題。

如果我直接從一個映射活動轉到另一個映射活動,那麼分配的堆 會增長並最終在16M時崩潰。顯然它必須通過這條路線泄漏到某個地方。

我在所有3個活動中記錄每個onCreate,Start,Resume,Pause,Stop和Destroy。 如果我使用後退按鈕路線我的日誌:

選擇活動 - >谷歌活動 - > OSM活動

Select Activity Pause 
Google Activity Create 
Google Activity Start 
Google Activity Resume 
Select Activity Stop 
Google Activity Pause 
Open SM Activity Create 
Open SM Activity Start 
Open SM Activity Resume 
Google Activity Stop 
Google Activity Destroy 

通過後退按鈕去(通過在谷歌的活動按鈕直接),我得到

選擇活動 - >谷歌活動 - >選擇活動 - > OSM(通過後退鍵)

Select Activity Pause 
Google Activity Create 
Google Activity Start 
Google Activity Resume 
Select Activity Stop 
Google Activity Pause 
Select Activity Start 
Select Activity Resume 
Google Activity Stop 
Google Activity Destroy 
Select Activity Pause 
Open SM Activity Create 
Open SM Activity Start 
Open SM Activity Resume 
Select Activity Stop 

在第一個示例中,直到OSM 創建,啓動和恢復之後,Google活動纔會停止或銷燬。這對泄漏有重要意義嗎?

我設置爲null onPauses中的所有計時器,處理程序和覆蓋。 (由於Google maps.jar和osmdroid.jar之間的差異,在一個活動中結合這兩個視圖並不是真正的選擇)

在我的點擊處理程序中代碼有什麼問題嗎?

所有的建議將受到感謝。

EDIT 2月26日

而且我原來的職位 - 跳躍點對我來說是:

爲什麼要在一個活動的onDestroy到的onResume第二前運行內存使用停止增長的活動?

如果在的onResume活動乙活性A中的onDestroy之前運行,然後我看到的歷史堆棧上的活動的數量(所報告的ADB殼dumpsys meminfo中)通過每次一個增加。在代碼中或通過DDMS中強制GC的數量都不會將它們從堆棧中取出。

我已經修改了我的代碼,所以clickhandler只是調用finish()。在onDestroy中,我調用startActivity()。這會在運行其他活動之前短暫地將屏幕返回到選擇模式活動。在這些情況下,顯然A中的onDestroy()在B中的onResume()之前運行,並且歷史堆棧或堆使用率都不會增長。

我只是不明白。

+0

我們需要更多代碼才能提供幫助。 –

+0

我想我必須發佈整件事,這會讓人困惑,所以我試圖將我的問題範圍縮小到最低限度。我真的在尋找一個答案,爲什麼通過clickHandler退出,並通過後退按鈕不退出? I.e有沒有什麼問題,完成()然後startAcivity()? – NickT

回答

0

我會大力推薦使用Eclipse MAT(內存分析器)工具來對付您計劃發佈的所有Android應用程序。

我已經注意到應用程序,我一直在努力結束與模式的內存泄漏標準的Java開發人員知道不會造成內存泄漏。

使用MAT工具來跟蹤造成泄漏的依賴關係,並重寫該代碼,或者在最壞的情況下,我採取了反射來破壞依賴關係並允許它釋放。

+0

我用過MAT。它只是給我「串」和類的「嫌疑人」。我真的很想讓嫌疑人受到審判,或者被判無罪或者被判有罪,就像英國法律一樣。 MAT給我判斷「未證實」的蘇格蘭法律中的判決。 – NickT

+1

運行你的應用程序並查看直方圖。在轉儲HPROF之前將垃圾收集器搗碎幾次。我發現更可靠的顯示仍在記憶中的東西,而不是我懷疑混淆的嫌疑人頁面。任何記憶中不應該記憶的東西都是需要考慮的事情。 (你可以看看adb logcat輸出,看看垃圾回收器什麼時候不再釋放任何東西,當你點擊GC按鈕時,這意味着它已經完成了它的所有工作) –

+0

順便說一句,部分蘇格蘭:P –

0

您可以從相同的內存泄漏問題進行痛苦在你here

0

它涉及到你的代碼前問了幾分鐘,因爲屋大維Damiean說,我們需要更多的信息來幫助。我已經用3個簡單的活動嘗試過你的情況,不會發生泄漏。每個活動實例被銷燬都可以成功GCed。這意味着您的應用程序可能存在缺陷,或者您的應用程序顯示的框架中存在缺陷。無論如何,我們需要的不僅僅是你提供的描述。

但是,正如您已經知道您泄露「GoogleActivity」和「OpenSMActivity」一樣,MAT可能會有幫助。

轉儲hprof文件,單擊「打開查詢瀏覽器」(左邊的搜索按鈕),然後「合併最短路徑GC根」 - >「排除所有幻像/弱/軟等引用」。填寫泄漏活動的完整課程名稱並完成。然後你會看到誰在持有你的活動。