Androidでメモリリークを回避する方法について多くの記事を読みましたが、それが正しいかどうかはまだよくわかりません。
- 私のアプリケーションは単一ので構成されてい
Activity
ます。 - そのアクティビティにはプライベートメンバーまたは静的メンバーがありません。すべてのコードは内から開始されます
onCreate()
。 Context
には、静的インスタンスがaまたはView
sへの参照を保持することがある自己完結型の静的クラスがあります 。私のonDestroy()
メソッドでは、これらのインスタンスをすべてnullに設定しました。- 私はすべてをリサイクルします
Bitmap
。
Q1:それで十分ですか?
私を混乱させるのは、ネット上で見つけることができるノーゴーの典型的な例です(http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/):
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
TextView label = new TextView(this);
label.setText("Leaks are bad");
setContentView(label);
}
onCreate
終わったらすぐlabel
にスコープから外れてGCになると思いました。
Q2:これはどのようにしてメモリリークを引き起こすのですか?
私のアクティビティは基本的に次のようになります。
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* Statics */
AssetUtils.initIndex(this);
BitmapLoader.startInstance(this);
/* frame */
ViewGroup frame = (ViewGroup) getLayoutInflater().inflate(R.layout.frame, null);
this.setContentView(frame);
/* create controller */
Controller controller = new Controller(frame, getLayoutInflater());
/* START */
controller.start();
}
@Override
public void onDestroy() {
super.onStop();
/* Statics */
AssetUtils.destroyInstance();
BitmapLoader.destroyInstance();
}
内部では、手動で作成したなどに渡すために使用をController
取得することがあります。すべてがに戻るクラスのメンバー変数にのみ、静的にどこかに格納されることはありません。Context
View#getContext()
View
Controller
Q3:見落としているものはありますか?