【问题标题】:WebView OutOfMemoryExceptionWebView OutOfMemoryException
【发布时间】:2011-09-23 18:38:06
【问题描述】:

我正在使用 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 Heap 视图显示它有足够的“空闲”内存,但它仍然可能会给出如下错误:

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

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

ERROR/Web Console(18033): SECURITY_ERR: DOM Exception 18: 试图突破用户代理的安全策略。在...

【问题讨论】:

    标签: android caching webview out-of-memory allocation


    【解决方案1】:

    我切换到 loadDataWithBaseURL,它不需要 URLEncoder 对 url 进行编码,并且不会在历史记录中保留大量数据 url。这似乎解决了高 CPU 使用率和内存泄漏问题,以及 SECURITY_ERR:

    WebView.loadDataWithBaseURL(url,data,"text/html","UTF-8",url);
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我在 onLowMemory 中放了一个 Log.d,它甚至在内存不足和崩溃之前都没有记录。根据文档:“当整个 系统 内存不足时调用...”
      • 将缓存模式设置为 LOAD_NO_CACHE 也不能解决问题。
      • 看看这里的推荐:stackoverflow.com/questions/2881139/… 看来您正在构建一个 StringBuilder ,这反过来可能会破坏堆大小,所以 WebView 只是问题的一部分。
      猜你喜欢
      • 2011-07-14
      • 2012-02-25
      • 2011-05-14
      • 2014-07-21
      • 2011-11-24
      • 1970-01-01
      • 2011-06-17
      • 2013-05-18
      • 1970-01-01
      相关资源
      最近更新 更多