2010年10月5日火曜日
Android のメモリ管理は大変です
■理想
AndroidってJavaだからメモリ管理なんてしなくてもいいよね!!
なんて思っていた時代が私にもありました・・・
■現実
WeakReferenceとか使えばいいんでしょうけど面倒なんですよねぇ。
■Google曰く
http://d.hatena.ne.jp/nakamura001/20101002/1286015483
iPhoneより普通に厳しい気がするのは気のせいでしょうか
■結論
AndroidはJavaではないのできちんとメモリ管理をしましょう!
AndroidってJavaだからメモリ管理なんてしなくてもいいよね!!
なんて思っていた時代が私にもありました・・・
■現実
@Override
protected void onDestroy() {
super.onDestroy();
// 画面が回転した時など、Activityが破棄されるときに呼び出されます
// すべてのメモリはここで開放します
// - 特に危険なのが内部クラス(MyWebChromeClientなど)、正しく開放しないとActivityが開放されません
// - セットしたbackgroundのcallbackもnullにしないと開放が行われません
// - webViewのdestroy()を忘れると後からGCが走ったときにVMがクラッシュします
this.webView.stopLoading();
this.webView.setWebChromeClient(null);
this.webView.setWebViewClient(null);
this.unregisterForContextMenu(this.webView);
this.webView.destroy();
this.webView = null;
Drawable backgroundDrawable = this.backgroundViewGroup.getBackground();
backgroundDrawable.setCallback(null);
this.backgroundViewGroup.setBackgroundDrawable(null);
this.backgroundViewGroup = null;
this.mainViewGroup = null;
this.anotherViewGroup = null;
}
これだけやらないと平気でクラッシュします。マジです。しかもGCが走るまでクラッシュしないとかそういう厄介すぎる現象に2回ほど遭遇しました。WeakReferenceとか使えばいいんでしょうけど面倒なんですよねぇ。
■Google曰く
http://d.hatena.ne.jp/nakamura001/20101002/1286015483
iPhoneより普通に厳しい気がするのは気のせいでしょうか
■結論
AndroidはJavaではないのできちんとメモリ管理をしましょう!