1. ホーム
  2. android

WebViewのメモリリーク

2023-09-02 17:08:35

質問

WebViewが埋め込まれているxmlレイアウトを使用しているアクティビティがあります。私は私の活動コードでWebViewを全く使用していません、それはすべて私のxmlレイアウトにそこに座っていて、目に見えることです。

今、私が活動を終了するとき、私は私の活動がメモリからクリアされないことを発見します。(hprof ダンプで確認しました)。xml レイアウトから WebView を削除すると、アクティビティは完全にクリアされますが。

私はすでに

webView.destroy();
webView = null;

を私のアクティビティのonDestroy()に追加しましたが、これはあまり役に立ちません。

私のhprofダンプでは、私の活動('Browser'という名前)は、以下の残りのGCルートを持ちます(呼び出した後 destroy() を呼び出した後)。

com.myapp.android.activity.browser.Browser
  - mContext of android.webkit.JWebCoreJavaBridge
    - sJavaBridge of android.webkit.BrowserFrame [Class]
  - mContext of android.webkit.PluginManager
    - mInstance of android.webkit.PluginManager [Class]  

他の開発者が同じようなことを経験していることがわかりました。 http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/

確かに非常に興味深い記事です。 最近、私は非常に苦労しました。 をトラブルシューティングするのに非常に苦労しました。 トラブルシューティングに非常に苦労しました。最終的に、それは判明しました。 xmlレイアウトにWebViewコンポーネントが含まれていて コンポーネントが含まれており、それが使われていないにもかかわらず メモリリークを防いでいることがわかりました。 gが収集されるのを防いでいました。 これは現在の実装のバグなのでしょうか? これは現在の実装のバグでしょうか、それとも 現在の実装のバグなのか、それとも WebViewsを使用する場合

さて、残念ながら、この質問についてブログやメーリングリストではまだ回答がありません。したがって、SDK のバグではないかと考えています (おそらく、報告された MapView のバグに類似しています)。 http://code.google.com/p/android/issues/detail?id=2181 ) か Webビューを埋め込んだアクティビティをメモリから完全に取り除く方法 ?

どのように解決するのですか?

XMLレイアウトを介してWebViewを作成するとき、アクティビティは、アプリケーションコンテキストではなく、WebViewのコンテキストとして渡されます。アクティビティを終了するとき、WebViewはまだアクティビティへの参照を保持し、したがって、アクティビティはメモリから削除されません。 私はそれのためのバグレポートを提出しました、上記のコメントのリンクを参照してください。

webView = new WebView(getApplicationContext());

この回避策は特定のユースケースにしか使えないことに注意してください。例えば、href-link やダイアログなどへのリンクなしに、html を webview に表示する必要がある場合です。以下のコメントを参照してください。