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);
ってやればメモリリークが出なくなりました。良かったね。はあ。いいんかこれで。
で、ここからは余談なんですけど、stackoverflowにこんなエントリがあります。
みんな頑張ってますが、決定的な解決策は出てきてないですね。
その投稿をした方がバグレポートを出してくれています。
しかし、未だに直ってませんw
どうも、WebViewじゃなくて、もっと根本のViewRootImplが悪いっぽいですね。今回遭遇したメモリリークも結局WebView関係ないし。
環境:
Nexus 7 2013
API Level 19
eclipseで現在編集中のファイルと最新コミットとのdiffが見た〜い!
現在編集中のファイルと最新コミットとのdiffが見たいという場合ってよくありますよね. 下のリンクに助けられました.Git staging viewを使えばラクチンです.
http://did2memo.net/2012/10/10/eclipse-git-git-staging-view/
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;
}
}