怒りのプログラミング

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

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

Android SDK ManagerでFailed to create directory... というエラーが出てインストールができない

SDK Manager.exeを管理者権限で実行すればOK。 こういうの、エラー表示するだけじゃなくて、「実はこうなんじゃないの?」ってヒントも出してほしい。

編集:

単にSDK Manager.exeを C:\Program Files 以下に置かないようにすればいい。 例えば、C直下にAndroid開発用のフォルダ作るとか。

これはマジで恥ずかしいヾ(- -;)

std::vectorのresize()でつまづいた

std::vectorのresize( size_type size, TYPE val )では,新規に追加された要素だけをvalで埋めるのか......

http://www.cppll.jp/cppreference/cppvector_details.html#resize

assign()のように全部valで埋めてくれるのかと思っていた.名前も「resize」なわけだから,そこらへんちゃんと察すればよかったってか,ちゃんと読めってことですね.

valgrind

書き忘れていたけど,11月11日のエラー

http://angry-at-programming.hatenablog.com/entry/2013/11/11/192515

は,valgrindというメモリリークを検出してくれる神ツールで解決できてた. ココ見れば簡単に使えます.

http://www31.atwiki.jp/bigoyayubi/pages/49.html

valgrindすごい

c++でのイテレータのポインタ

あるデータを参照するイテレータをさらに参照するということがしたかったので,ポインタでやってみた.

これってイテレータイテレータ,みたいに書けるのかな?ほとんどの場合でイテレータはただのポインタとして実装されているのを読んだので,イテレータイテレータというように書けると思うけど,ポインタで書いてしまった.

int main() {
    std::vector< int > vec;
    std::vector< int >::const_iterator itr_vec; // vecのある要素を指すイテレータ
    std::vector< int >::const_iterator* ptr_itr_vec; // itr_vecを指すポインタ

    // vecのインスタンス化 vec=[ 0, 1, 2, 3, 4 ]
    for( int i=0; i<5; ++i ) {
        vec.push_back( i );
    }

    // vecの先頭要素を参照
    itr_vec = vec.begin();

    // itr_vecを参照
    ptr_itr_vec = &itr_vec;
    std::cout << "*itr_vec = " << *itr_vec << " **ptr_itr_vec = " << **ptr_itr_vec << std::endl;

    // ++itr_vecでvecの参照先を進めながら内容を表示
    while( itr_vec != vec.end() ) {
        std::cout << "*itr_vec = " << *itr_vec << " **ptr_itr_vec = " << **ptr_itr_vec << std::endl;
        ++itr_vec;
    }
}