2012-01-17 58 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中删除对象。

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