我已經寫了一個地圖應用程序,可以使用谷歌地圖或開放街道地圖 作爲瓷磚供應商。 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()之前運行,並且歷史堆棧或堆使用率都不會增長。
我只是不明白。
我們需要更多代碼才能提供幫助。 –
我想我必須發佈整件事,這會讓人困惑,所以我試圖將我的問題範圍縮小到最低限度。我真的在尋找一個答案,爲什麼通過clickHandler退出,並通過後退按鈕不退出? I.e有沒有什麼問題,完成()然後startAcivity()? – NickT