Androidアプリ開発 メモリの消費をなるべく抑える

Android

Androidアプリ開発 メモリの消費をなるべく抑える

私のようなサーバーサイドプログラムからスマホアプリ開発に移行してきたプログラマにとっては、スマホのメモリが少なすぎて、いろんな処理ができないのはとても悲しく感じますが、しかしやらねばならぬときもありますね。
アプリがメモリ消費が少なければ少ないほど、そのアプリは早く動くからです。

ちょっと盲点だったことに、下記のブログが言及していたので、メモしておきます。

Avoiding memory leaks
http://android-developers.blogspot.jp/2009/01/avoiding-memory-leaks.html

Romain Guyさんという人が2009年にいわく、メモリーリークの原因の多くは、Contextのむやみな使いまわしにある、ということです。

あー、あるある。ありますよ!

とにかく使うContext。

 //Activity内
 Context context = this;

上記のようにContext = Activity として、いろんなところで使いまわしていませんか?
私は、結構してました。orz

つまり、ContextがActivityなわけだから、Contextを渡しちゃうと、Activity全体への参照がいつまでたっても残ってしまい、メモリーを使い続けちゃうってわけなんですね。

でも、Contextが必要なんだよぉぉ という人は、

 Context.getApplicationContext() or Activity.getApplication().

を使いたまえ、ということだそうです。

にゃるほど!!

他にもブログのサンプルコードには、下記のようなことはダメ!絶対!ということです。
まー、こんなことする人いるのかな?
と思いますが、ありえない話ではないですよね。

 private static Drawable sBackground;
 
 @Override
 protected void onCreate(Bundle state) {
  super.onCreate(state);
  
  TextView label = new TextView(this);
  label.setText("Leaks are bad");
  
  if (sBackground == null) {
    sBackground = getDrawable(R.drawable.large_bitmap);
  }
  label.setBackgroundDrawable(sBackground);
  
  setContentView(label);
 }

そのライフサイクルをコントロールできないstaticではないインナークラスを使わないこと、だそうです。
WeakReference を使った、staticなインナークラスを作りましょうね!というこどです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です