Жизненный цикл приложения и метод onCreate в android sdk - PullRequest
1 голос
/ 20 апреля 2010

Я собрал простое тестовое приложение, которое имеет кнопку и издает шум, когда пользователь нажимает на нее. Вот этот метод:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button b = (Button)findViewById(R.id.easy);
    b.setOnClickListener(this);
}

public void onClick(View v) {
    MediaPlayer mp = MediaPlayer.create(this, R.raw.easy);
    mp.start();
    while(true) {
        if (!mp.isPlaying()) {
            mp.release();
            break;
        }
    }
}

Мой вопрос: почему onCreate работает так, будто он находится в цикле while? Я могу нажать на кнопку в любое время, и она издает звук. Я мог бы подумать, что это было просто свойство слушателей, но объект Button не был переменной-членом. Я думал, что Android просто пройдет через OnCreate и перейдет к следующему методу жизненного цикла.

Кроме того, я знаю, что мой текущий способ видеть, воспроизводится ли звук, это дерьмо ... Я вернусь к этому позже. :)

Спасибо.

1 Ответ

1 голос
/ 20 апреля 2010

Вы думаете об экземпляре кнопки с точки зрения кода, который вы написали, а не об экземпляре, который живет в представлении, созданном фреймворком. Ваша переменная Button (b) - просто ссылка на это. Ваша ссылка больше не существует, когда метод onCreate выходит из области видимости, но кнопка все еще существует в вашем пользовательском интерфейсе. Ваша ссылка была достаточно длинной, чтобы прикрепить к ней метод слушателя, поэтому время жизни кнопки (которое вы все еще видите в пользовательском интерфейсе после появления и исчезновения onCreate, очевидно) больше связано с тем, когда вы можете его видеть, а не с область действия созданной вами переменной.

Кстати ... я знаю, что вы только начинаете, и ваш код MediaPlayer был просто создан вместе, но для дальнейшего использования вам не нужен цикл while. MediaPlayer предоставляет вам обратный вызов onCompletionListener:

OnCompletionListener

...