2011-10-27 64 views
0

在我的應用程序中有能力有無盡的活動堆棧。該方案是,您從一個用戶的頁面開始,該頁面上有一個該用戶的「朋友」的人員列表。然後,您可以點擊一個朋友去到他們的頁面,看起來就像前面一個,在那裏你可以再點擊另一個朋友去他們的網頁,等等...無盡活動計劃

最大的問題,我面對的是一個無盡的本土堆。我相信每次觀看視頻時都會加入這個堆。經過幾次迭代後,我得到了一致的OOM錯誤,所以我必須找到某種解決方案。訣竅是,我想保留最少的最後幾項活動來瀏覽一些歷史記錄。

我能想出的最好的是監視活動堆棧,然後開始整理活動,當它達到一定點。這聽起來像一個堅實的方法,或者甚至更進一步,任何人都可以指出我實施這種或另一種方法?

感謝

編輯:

堆棧是非常簡單的。點擊Listrow(朋友),進入他們的頁面。這是使用一個正常的startActivity調用,意圖與您所在的頁面相同,然後使用用戶標識附加一個額外的意圖,然後調用數據庫或遠程api調用來獲取用戶的數據。

此外,跟進有關的Dalvik VS本土的,我在我的導航過程中我經常檢查meminfo中轉儲。我將達爾維克堆放得儘可能小,清理onStop中的資源。本地堆增長得更快。我沒有對任何位置的硬引用,但從通貨膨脹屏幕上的相當多的可繪圖。這些drawable會導致android最終殺死我的活動嗎?盡我所能告訴他們只是導致了OOM,沒有任何我的活動被預防性地銷燬。

如果我可以手動破壞我的活動,而不只是阻止他們(由於Android聲稱內存不足時做),並保持破壞活動的堆棧中保存的狀態上,這將是理想的。再次

編輯:

另一個關鍵是,這些活動將有例如與他們混在其他活動

用戶 - >用戶 - >活動 - >用戶 - > b活動 - >用戶

所以這就是爲什麼我想利用內置的堆棧,所以我知道,當我必須去一個用戶活動,當我沒有。

+0

究竟如何你實現你的用戶頁面的「堆棧」? – josephus

回答

0

我不認爲您遇到的OOM問題與您打開的活動數量有關。隨着內存壓力的增加,Android應該在後臺銷燬任何舊活動。這些活動將在用戶通過任務堆棧返回時重新創建。

你用過像MAT(內存分析工具)的工具來檢查你有你的應用程序運行期間分配的。我懷疑你可能有內存泄漏,或者你的內存分配可能會更聰明。

+0

我已經使用過MAT,並且在釋放資源onStop時也非常小心。當我更深入地瀏覽meminfo轉儲時,native和dalvik都會上升。由於本機堆問題,系統是否會終止活動?我認爲這是單獨的... –

+0

嗯,我希望本地和達爾維克都走了,直到GC運行。如果你的大部分記憶都是分配給本機的話,我認爲你的假設是正確的,Dalvik不會對此做出反應。這聽起來像你在本地做大部分工作。你確定你的清理工作正常嗎,因爲當你移動到棧中的下一個時,onStop應該被調用。 –

+0

我的清理工作正常,但可能不夠徹底。我清除列表並列出回收站來擺脫行,但其他視圖是完好無損的,這意味着我列表以外的所有內容都保留其可繪製對象(按鈕,背景,標題圖像等)。我懷疑這就是爲什麼本地堆只是繼續向上,每次它膨脹這些可繪製的東西,他們只是坐在那裏。所以我看到它的方式要麼必須在停下來的時候殺掉所有的視圖(這看起來像是矯枉過正),要麼調整我的活動堆棧的大小。如果我能看到我的本地堆裏有什麼,我會更有信心。 –

1

怎麼樣使這個活動singleInstance,攔截的KeyEvent。KEYCODE_BACK,打造自己的後退按鈕堆爲這項活動

我在這裏做了一些例子:

http://esilo.pl/selvin/endlessactivity.zip

+0

是一個好主意(併爲此贊成),但是我的需求稍微複雜一些。我忽略的一點是,這些活動將有其他活動與他們混合,編輯上面,以反映 –

+0

下載新版本(來自同一個來源)...我忘了添加'setIntent(意圖);'在公共void onNewIntent(Intent intent)'(如果你改變方向,你將失去後臺) – Selvin