Когда именно безопасно использовать (анонимные) внутренние классы?

Я читал несколько статей об утечках памяти в 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(), восстановит ли это значения полей (как они были до изменения ориентации)? Будет ли это также восстанавливать состояния внутренних классов?

Я понимаю, что мой вопрос не очень точен, но я был бы очень признателен за любое объяснение, которое могло бы прояснить ситуацию.

313
задан gobernador 10 June 2012 в 09:10
поделиться