Я читал некоторые статьи об утечке памяти в Android и смотрел это интересное видео из Google I/O по теме.
Тем не менее, я не совсем понимаю концепцию, и особенно когда она безопасна или опасна для пользователя внутренних классов внутри Activity.
Вот что я понял:
Утечка памяти произойдет, если экземпляр внутреннего класса сохранится дольше, чем его внешний класс (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()
, это восстановит значения полей (как это было до изменения ориентации)? Будет ли это также восстанавливать состояния внутренних классов?
Я понимаю, что мой вопрос не очень точен, но я бы очень признателен за любое объяснение, которое может сделать все более ясным.