2011-06-27 9 views
0

loadData()を使用してWebViewに長いページを読み込んでいますが、残念なことに5〜10ページのリンクのあとでOutOfMemoryExceptionが発生します。これは、すべてのページのURL:完全なデータを保持している履歴が原因である可能性があります。WebView OutOfMemoryException

私はステータスバーにメモリ&cpuモニタを持っており、常にメモリ使用量はほとんどないので、アプリケーションはすべてのメモリを使い果たしていません。 Javaのコマンドラインスイッチと同様に、私のアプリがより多くのメモリを使用できるようにする方法はありますか?このクラッシュを防ぐために、おそらくSDカードにキャッシュを作成することで、Webビューをより効率的にする方法はありますか?

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ヒープビューは、それが「無料」のメモリをたくさん持っていた示しているが、それはまだのようなエラーを与えることがあります。それはATの場合

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

私は知りませんすべてが関連していますが、メモリを解放する前にページを開くときにこの警告が表示されることがあります。セキュリティ/ ERROR:DOM例外18:セキュリティポリシーを破りました。ユーザエージェント。 ...

答えて

0

私はURLEncoderでURL​​をエンコードする必要がなく、履歴に膨大なデータのURLを保持しないloadDataWithBaseURLに切り替えました。これは、高いCPU使用率とメモリリーク、およびSECURITY_ERR固定しているようだ:それはメモリを使い果たし、墜落する前に、私はonLowMemoryでLog.dを入れ

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

onLowMemory()を実装し、WebViewでfreeMemoryを使用すると考えましたか? clearCacheも使用できます。もう1つの考慮点は、cache modeを変更することです。

+1

を、それも記録しませんでした。ドキュメントによると、「全体的な*システム*のメモリが不足しているときに呼び出されます...」 – NoBugs

+0

キャッシュモードをLOAD_NO_CACHEに設定しても、どちらも修正されません。 – NoBugs

+0

ここでの推奨事項を見てください:http://stackoverflow.com/questions/2881139/outofmemoryerror-what-to-increase-and-how StringBuilderを構築しているように見えますが、これはHeapサイズを破る可能性があります。問題の一部のみ –