在Android中调用多个WebView时如何控制内存使用?

时间:2012-01-17 11:23:07

标签: android caching memory android-activity webview

我的应用的主要活动是Activity,其中包含Webview来加载网页。

我覆盖方法shouldOverrideUrlLoading(WebView view, String url)以使每个网址请求调用Intent并加载包含WebView的新同一活动。

这样做是为了在按下BACK键时提供更好的体验,只需完成当前活动并返回到前一个活动,与单个webview中的goBack()相比,不需要再次渲染页面。

但现在的问题是,在我打开许多URL后,在后台创建一个长队列活动时,它使用的内存变得很大。

当我回到启动器并检查进度时,我可以看到我的应用程序缓存超过200M的数据。这是不可接受的......

有趣的是,我可以看到我的应用程序耗尽了我的内存,但在Eclipse中的DDMS的Heap视图中,我可以看到应用程序分配的内存不超过10M。所以我想webStorage缓存的{200}是Webview

有没有办法控制内存?

我正在考虑一次只保存5层活动,当回去5次时,只需跳回主页。但是仍然不知道如何在我需要的5个活动旁边释放内存,我将永远不会再使用它?

或者,如果是因为WebView自动缓存网页,我该如何手动管理?比如设置最大缓存大小或页数的限制?

1 个答案:

答案 0 :(得分:1)

一般来说,我同意凯文的评论。我认为保留多个Activity对象以防止重新加载WebView对于资源有限的移动环境来说是违反直觉的。

话虽如此,你有很多不同的问题和解决方案的可能性,所以我没有一个单一的答案。查看这些链接以查看是否有任何帮助:

ActivityManager - 你可以使用大量的东西,查看它的子类。

ActivityManager.RunningTaskInfo - 从未使用它,但似乎有一些有用的东西,特别是在确定哪些Activity正在运行时。

ActivityManager.MemoryInfo - 可以提供有关可用系统内存的信息以及最低内存阈值。

Application.onLowMemory() - 当你的应用程序成为内存耗尽时告诉你。您可以覆盖此方法,并在调用此方法时开始销毁Activity。您可能需要调用super.onLowMemory()以确保操作系统处理它所需的内容。

涉及控制活动数量的一种可能的解决方案:

覆盖Application并创建一个包含5个public static ArrayList<Activity>个对象的Activity。每当您为onCreate()执行Activity时,您可以将活动添加到ArrayList,然后检查大小。如果尺寸> 5然后将intent发送到位置0的Activity,这将使其处理意图并致电finish()。然后从ArrayList

中删除该对象

不应该做太多工作,但缺点是你必须手动管理事情。我相信有更精明的解决方案可能。