Я прочитал ряд статей о том, как избежать утечек памяти в Android, но я все еще не совсем уверен, правильно ли я понял.
- Мое приложение состоит из одного
Activity
. - У меня нет каких-либо частных или статических членов в этом Activity, весь код запускается из
onCreate()
. - In имеют некоторые автономные статические классы, чьи статические экземпляры иногда содержат ссылки на
Context
илиView
s. В моем методеonDestroy()
я установил для всех этих экземпляров значение null. - Я перерабатываю все мои
Bitmap
s.
Q1: Этого достаточно?
То, что меня смущает, - это классический пример не-go, который вы можете найти в сети (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
выходит за пределы области действия и является GCed.
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: Есть ли что-то, что я забыл?