1 votes

Cycle de vie des applications et méthode onCreate dans le SDK Android

J'ai créé une application de test simple qui comporte un bouton et émet un bruit lorsque l'utilisateur clique dessus. Voici sa méthode :

@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;
        }
    }
}

Ma question est la suivante : pourquoi onCreate se comporte-t-il comme s'il était dans une boucle de temps ? Je peux cliquer sur le bouton n'importe quand, et le son est émis. Je pourrais penser que c'est juste une propriété des listeners, mais l'objet Button n'est pas une variable membre. Je pensais qu'Android ne ferait que passer par onCreate une fois, et passerait à la méthode suivante du cycle de vie.

De plus, je sais que ma façon actuelle de voir si le son est joué est merdique... j'y reviendrai plus tard. :)

Merci.

1voto

Rich Points 16818

Vous pensez à l'instance du bouton en termes de code que vous avez écrit, par opposition à une instance qui vit dans une vue que le framework a construite. Votre variable Button (b) est simplement une référence à cette instance. Votre référence n'est plus vivante une fois que la méthode onCreate est sortie de son champ d'application, mais le bouton existe toujours dans votre interface utilisateur. Votre référence a existé suffisamment longtemps pour qu'une méthode d'écoute lui soit attachée, de sorte que la durée de vie du bouton (que vous voyez toujours dans l'interface utilisateur après que la méthode onCreate soit sortie de son champ d'application, évidemment) est davantage associée au moment où vous pouvez le voir et non à la portée de la variable que vous avez créée.

Je sais que vous venez de commencer et que votre code MediaPlayer a été assemblé à la va-vite, mais pour votre information, vous n'avez pas besoin d'une boucle while. MediaPlayer vous donne un callback onCompletionListener :

OnCompletionListener

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X