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なインナークラスを作りましょうね!というこどです。