android - WebView 内存不足异常

标签 android caching webview out-of-memory allocation

我正在使用 loadData() 将长页面加载到 WebView 中,不幸的是,在大约 5 或 10 个页面链接后,它给出了 OutOfMemoryException。这可能是由于历史包含完整数据:每个页面的 url。

我在状态栏中有一个内存和 CPU 监视器,它总是几乎不显示任何内存使用情况,因此应用程序没有用完所有内存。有没有办法让我的应用程序使用更多内存,类似于 Java 的命令行开关?有没有办法让 webview 更高效,也许通过在 sd 卡上做一个缓存,来防止这种崩溃?

06-27 12:02:44.746: WARN/System.err(6692): java.lang.OutOfMemoryError
06-27 12:02:44.746: WARN/System.err(6692):     at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:97)
06-27 12:02:44.746: WARN/System.err(6692):     at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:157)
06-27 12:02:44.746: WARN/System.err(6692):     at java.lang.StringBuilder.append(StringBuilder.java:217)
06-27 12:02:44.746: WARN/System.err(6692):     at android.webkit.BrowserFrame.startLoadingResource(BrowserFrame.java:710)
06-27 12:02:44.746: WARN/System.err(6692):     at android.webkit.BrowserFrame.nativeLoadUrl(Native Method)
06-27 12:02:44.746: WARN/System.err(6692):     at android.webkit.BrowserFrame.loadUrl(BrowserFrame.java:248)
06-27 12:02:44.746: WARN/System.err(6692):     at android.webkit.WebViewCore.loadUrl(WebViewCore.java:1564)
06-27 12:02:44.746: WARN/System.err(6692):     at android.webkit.WebViewCore.access$1400(WebViewCore.java:52)
06-27 12:02:44.746: WARN/System.err(6692):     at android.webkit.WebViewCore$EventHub$1.handleMessage(WebViewCore.java:950)
06-27 12:02:44.746: WARN/System.err(6692):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-27 12:02:44.746: WARN/System.err(6692):     at android.os.Looper.loop(Looper.java:123)
06-27 12:02:44.746: WARN/System.err(6692):     at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:623)
06-27 12:02:44.746: WARN/System.err(6692):     at java.lang.Thread.run(Thread.java:1096)
06-27 12:02:44.746: WARN/dalvikvm(6692): threadid=8: thread exiting with uncaught exception (group=0x40020ac0)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692): FATAL EXCEPTION: WebViewCoreThread
06-27 12:02:44.756: ERROR/AndroidRuntime(6692): java.lang.OutOfMemoryError
06-27 12:02:44.756: ERROR/AndroidRuntime(6692):     at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:97)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692):     at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:157)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692):     at java.lang.StringBuilder.append(StringBuilder.java:217)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692):     at android.webkit.BrowserFrame.startLoadingResource(BrowserFrame.java:710)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692):     at android.webkit.BrowserFrame.nativeLoadUrl(Native Method)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692):     at android.webkit.BrowserFrame.loadUrl(BrowserFrame.java:248)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692):     at android.webkit.WebViewCore.loadUrl(WebViewCore.java:1564)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692):     at android.webkit.WebViewCore.access$1400(WebViewCore.java:52)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692):     at android.webkit.WebViewCore$EventHub$1.handleMessage(WebViewCore.java:950)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692):     at android.os.Looper.loop(Looper.java:123)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692):     at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:623)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692):     at java.lang.Thread.run(Thread.java:1096)

奇怪的是,DDMS 堆 View 显示它有足够的“空闲”内存,但它仍然可能会给出如下错误:

ERROR/dalvikvm-heap(10612): Out of memory on a 1153232-byte allocation.

我不知道它是否完全相关,但有时在内存不足之前打开页面时会发出此警告:

错误/Web 控制台 (18033):SECURITY_ERR:DOM 异常 18:试图突破用户代理的安全策略。在……

最佳答案

您是否考虑过实现 onLowMemory()并使用 freeMemory在 WebView 上?您也可以使用 clearCache .另一个考虑是改变 cache mode .

关于android - WebView 内存不足异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6497780/

相关文章:

c++ - 增量挑战 :++ vs. +1

multithreading - 实现 token 缓存

android - 如何在没有 Google 文档或 Google 驱动器的情况下从 URL 打开 PDF

android - 通过网站的 webview 推送通知?

android - 从 fragment 中的适配器调用更新搜索栏时,MediaPlayer 跳过音频

android - Google Play 服务已过时。需要 4242000 但找到 4132534

caching - 当接近磁盘限制时,Nginx 缓存管理器会清除文件吗?

android - 将 Android WebView 文本大小与 TextView 文本大小相匹配

java - 为什么 'Res' 变量保存一些随机数而不是从编辑文本字段检索数字?

java - 在 java(android) 中将字符串转换为 IP 地址