Я читал несколько статей об утечках памяти в Android и посмотрел это интересное видео с Google I/O на эту тему.
Тем не менее, я не совсем понимаю эту концепцию, особенно когда это безопасно или опасно для пользователя во внутренних классах внутри Activity.
Вот что я понял:
Утечка памяти произойдет, если экземпляр внутреннего класса существует дольше, чем его внешний класс (активность).-> В каких ситуациях это может произойти?
В этом примере, я полагаю, нет риска утечки, потому что анонимный класс, расширяющий OnClickListener
, никак не будет жить дольше, чем активность, верно?
final Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.dialog_generic);
Button okButton = (Button) dialog.findViewById(R.id.dialog_button_ok);
TextView titleTv = (TextView) dialog.findViewById(R.id.dialog_generic_title);
// *** Handle button click
okButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
}
});
titleTv.setText("dialog title");
dialog.show();
Итак, опасен ли этот пример и почему?
// We are still inside an Activity
_handlerToDelayDroidMove = new Handler();
_handlerToDelayDroidMove.postDelayed(_droidPlayRunnable, 10000);
private Runnable _droidPlayRunnable = new Runnable() {
public void run() {
_someFieldOfTheActivity.performLongCalculation();
}
};
У меня есть сомнения относительно того факта, что понимание этой темы связано с детальным пониманием того, что сохраняется, когда действие уничтожается и создается заново.
Да?
Допустим, я только что изменил ориентацию устройства (что является наиболее распространенной причиной утечек). Когда super.onCreate(savedInstanceState)
будет вызываться в моем onCreate()
, восстановит ли это значения полей (как они были до изменения ориентации)? Будет ли это также восстанавливать состояния внутренних классов?
Я понимаю, что мой вопрос не очень точен, но я был бы очень признателен за любое объяснение, которое могло бы прояснить ситуацию.