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

Posted

技术标签:

【中文标题】在Android中调用多个WebView时如何控制内存使用?【英文标题】:How to control memory usage when calling multiple WebView in Android? 【发布时间】:2012-02-12 04:58:26 【问题描述】:

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

我重写了shouldOverrideUrlLoading(WebView view, String url) 方法,使每个URL 请求都调用Intent 并加载包含WebView 的新相同活动。

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

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

当我返回启动器并检查进度时,我可以看到我的应用缓存了超过 2 亿的数据。这是不可接受的……

有趣的是,我可以看到我的应用程序耗尽了我的内存,但是在 Eclipse 中 DDMS 的堆视图中,我可以看到应用程序分配的内存不超过 10M。所以我猜这200M是webStorageWebview缓存的?

有没有办法控制内存?

我正在考虑一次只保存 5 层活动,然后返回 5 次就跳回主页。但是除了我需要的5个活动之外,我仍然不知道如何释放内存,我再也不会使用了?

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

【问题讨论】:

对我来说,这是一个提高速度的残酷解决方案...覆盖后退按钮的工作方式并使用页面转到另一个活动对我来说并不是真正的解决方案。您应该尝试优化页面以更快地加载,但使用压缩图像、压缩图像等。您可能可以调用其他一些 WebView 方法和设置来尝试加快速度。 【参考方案1】:

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

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

ActivityManager - 有很多你可以使用的东西,看看它的子类。

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

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

Application.onLowMemory() - 告诉您您的应用何时占用了内存。您可以覆盖此方法并在调用此方法时开始销毁Activity。您可能需要致电super.onLowMemory() 以确保操作系统能够处理它需要的内容。

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

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

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

【讨论】:

以上是关于在Android中调用多个WebView时如何控制内存使用?的主要内容,如果未能解决你的问题,请参考以下文章

android webview如何获取网页输出的提示信息

如何计算多个 android webview 所花费的总时间?

Android webview在调用loadurl时启动浏览器

Android程序中嵌入WebView,单击其中的链接时无反应,请问是啥原因引起的?如何解决?

Android webview如何检测何时重新加载

如何将webview内容划分为多个页面