WebView OutOfMemoryException - PullRequest
       49

WebView OutOfMemoryException

1 голос
/ 27 июня 2011

Я загружаю длинные страницы в WebView с помощью loadData (), к сожалению, после примерно 5 или 10 ссылок на страницы это дает исключение OutOfMemoryException. Вероятно, это связано с тем, что история содержит полные данные: URL каждой страницы.

У меня есть монитор памяти и процессора в строке состояния, и он почти не показывает использования памяти, поэтому приложение не использует всю память. Есть ли способ, позволяющий моему приложению использовать больше памяти, подобно ключам командной строки Java? Есть ли способ сделать веб-просмотр более эффективным, возможно, путем создания кэша на 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.

Я не знаю, связано ли это вообще, но иногда выдает это предупреждение при открытии страницы до нехватки памяти:

ОШИБКА / Веб-консоль (18033): SECURITY_ERR: DOM-исключение 18: Предпринята попытка прорваться через политику безопасности агента пользователя. в ...

Ответы [ 2 ]

1 голос
/ 27 июня 2011

Рассматривали ли вы реализацию onLowMemory () и использование freeMemory в WebView? Вы также можете использовать clearCache . Другим соображением будет изменение режима кэширования .

0 голосов
/ 02 июля 2011

Я переключился на loadDataWithBaseURL, который не требует URLEncoder, кодирующего URL, и не сохраняет огромные URL-адреса данных в истории.Это, похоже, исправило высокую загрузку процессора и утечку памяти, а SECURITY_ERR:

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