怒りのプログラミング

こんなポンコツがプログラマとして生活していることに驚きを禁じえません。 *ご指摘等あればお気軽にコメントください

AndroidのWebViewでズームを有効にするとメモリリークが発生する

AndroidのWebViewでズームを有効にするとメモリリークが発生してしまってます。

WebViewでズームを有効にするには、

myWebView.getSettings().setBuiltInZoomControls(true);

とやると思うんですが、 これを設定した状態でWebViewを貼っつけておいたActivityが破棄されるタイミングで、メモリリークが起きる。

以下、LogCatの出力です。

11-12 11:24:16.468: E/WindowManager(14366): android.view.WindowLeaked: Activity XXX.XXXActivity has leaked window android.widget.ZoomButtonsController$Container{41fd23c8 V.E..... ......I. 0,0-1200,97} that was originally added here
11-12 11:24:16.468: E/WindowManager(14366):     at android.view.ViewRootImpl.<init>(ViewRootImpl.java:348)
11-12 11:24:16.468: E/WindowManager(14366):     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
11-12 11:24:16.468: E/WindowManager(14366):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
......

このメモリリークの原因が自分のせいかどうかってのが実のところ自信がないんだけど、もしかしたら困っている人がいるかもしれないのでメモ。

LogCatも言ってるとおり、ZoomButtonsControllerが悪いのです。死ね拡大縮小ボタン!ということで、右下に出てくる拡大縮小ボタンが必要じゃなければ、最初のコードを

myWebView.getSettings().setBuiltInZoomControls(true);
myWebView.getSettings().setDisplayZoomControls(false);

ってやればメモリリークが出なくなりました。良かったね。はあ。いいんかこれで。

参考: http://developer.android.com/reference/android/webkit/WebSettings.html#setDisplayZoomControls(boolean)

で、ここからは余談なんですけど、stackoverflowにこんなエントリがあります。

みんな頑張ってますが、決定的な解決策は出てきてないですね。

その投稿をした方がバグレポートを出してくれています。

しかし、未だに直ってませんw

どうも、WebViewじゃなくて、もっと根本のViewRootImplが悪いっぽいですね。今回遭遇したメモリリークも結局WebView関係ないし。

環境:

Nexus 7 2013

API Level 19