2012-01-17 31 views
8

我的應用程序的主要活動是一個Activity,其中包含一個Webview加載網頁。如何在Android中調用多個WebView時控制內存使用情況?

我重寫了方法shouldOverrideUrlLoading(WebView view, String url)以使每個URL請求調用Intent並加載包含WebView的新同一活動。

這樣做是爲了提供更好的體驗,當按下BACK鍵時,只需完成當前活動並返回到前一個活動,無需再花時間再次呈現頁面,與在單個webview中使用goBack()相比。

但現在的問題是,當我打開很多網址,建立在後臺activitys的長龍,其佔用的內存變大。

當我回到啓動程序並檢查進度時,我可以看到我的應用程序緩存了超過200M的數據。這是不能接受的......

而且有趣的是,我可以看到我的應用程序中使用了我的記憶,但在DDMS的Eclipse中的堆視圖我可以看到應用程序分配的不超過10M的內存。所以我猜200M是webStorage緩存Webview

有沒有什麼辦法控制內存?

我在考慮只保存可能的5層活動,而當回到5次只是跳回主頁。但是仍然不知道如何在我需要的5個活動旁邊釋放內存,而我再也不會使用它了?

或者,如果那是因爲WebView是保持自動緩存網頁,哪能經理這個手動?如設置最大緩存大小或頁數的限制?

+0

對我來說,這是一個殘酷的解決方案來獲得速度......覆蓋後退按鈕的工作方式,並轉到頁面的另一個活動對我來說並不是一個真正的解決方案。您應該嘗試優化頁面以加快載入速度,但使用壓縮圖像,壓縮圖像等。可能還有其他WebView方法和設置可供您嘗試和加快速度。 – 2012-11-14 19:41:19

回答

1

一般來說,我同意Kevin的評論。我認爲保留多個Activity對象以防止重新加載WebView對於擁有如此有限資源的移動環境來說是違反直覺的。

話雖這麼說,你有很多的不同的問題和可能的解決方案,所以我沒有考慮到一個單一的答案。看看這些鏈接,看看有什麼東西是有幫助的:

ActivityManager - 有很多東西你可能會使用,看看它的子類。

ActivityManager.RunningTaskInfo - 從未使用它,但似乎有一些有用的東西,特別是在確定哪個Activity正在運行。

ActivityManager.MemoryInfo - 可以給你可用的系統內存信息,以及內存的底部閾值。

Application.onLowMemory() - 告訴你,當你的應用一直是內存豬。你可以重寫這個方法,並在被調用時開始銷燬Activity。您可能需要撥打super.onLowMemory()以確保操作系統處理它所需的內容。

的一種可能的解決方案涉及控制的活動的數量:

Application覆蓋並創建一個public static ArrayList<Activity>保持5個Activity對象。每當您對Activity執行onCreate()時,您可以將活動添加到ArrayList,然後檢查大小。如果尺寸大於5,則發送intent到位置0處的Activity,這將導致其處理該意圖並呼叫finish()。然後從ArrayList中刪除對象。

不應該做太多的工作,但不利的一面是你必須手動管理事情。我確信有一個更精明的解決方案可能。