2010年10月5日火曜日

Android のメモリ管理は大変です

■理想

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ではないのできちんとメモリ管理をしましょう!
投稿時間:
タグ: ,

AltStyle によって変換されたページ (->オリジナル) /