2010-04-19 4 views
1

J'ai collé ensemble une application de test simple dotée d'un bouton et qui émet un bruit lorsque l'utilisateur clique dessus. Voici c'est la méthode:Cycle de vie de l'application et méthode onCreate dans l'android sdk

@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, pourquoi agit comme onCreate il est dans une boucle while? Je peux cliquer sur le bouton à chaque fois, et ça fait du bruit. Je pourrais penser que c'était juste une propriété des écouteurs, mais l'objet de bouton n'était pas une variable de membre. Je pensais qu'Android ne ferait que passer par onCreate et passer à la prochaine méthode de cycle de vie.

Aussi, je sais que ma façon actuelle de voir si le son joue est de la merde ... J'y reviendrai plus tard. :)

Merci.

Répondre

1

Vous pensez à l'instance de bouton en termes de code que vous avez écrit, par opposition à une instance qui réside dans une vue construite par le framework. Votre variable Button (b) est simplement une référence à cela. Votre référence n'est plus en vie une fois que la méthode onCreate est hors de portée, mais le bouton existe toujours dans votre interface utilisateur. Votre référence était assez longue pour y attacher une méthode d'écoute, donc pour la durée de vie du bouton (que vous voyez toujours dans l'interface utilisateur après que l'onCreate est venu et passé, évidemment) est plus associée à quand vous pouvez le voir et non la portée de la variable que vous avez créée.

Btw ... Je sais que vous venez de commencer et que votre code MediaPlayer vient d'être lancé, mais pour référence future, vous n'avez pas besoin d'une boucle while. MediaPlayer vous donne un rappel onCompletionListener:

OnCompletionListener

+1

Ce n'est pas que « vous n'avez pas besoin d'une boucle while » - ayant cette boucle while va attacher le thread principal de l'application, le gel de votre interface utilisateur, et éventuellement la cause Android pour tuer votre activité. – CommonsWare

+0

Ah, merci pour la méthode. :) De toute façon, vous dites que j'ai supprimé le pointeur, mais pas l'objet lui-même, et parce que l'interface utilisateur conserve une référence au bouton, la JVM (ou ce que nous appelons la version android de la JVM), autour de. Si c'est le cas, cela signifie que le bouton va durer jusqu'à la fermeture de l'application, ou juste jusqu'à ce que l'activité se termine (ou qu'elle disparaisse de l'écran)? Merci encore. –

+0

Cela signifie simplement, ne pensez pas à la durée de vie de votre bouton comme étant la même que la durée de vie d'une variable qui pointe vers elle. Les mécanismes dans le cadre Android qui a construit votre interface utilisateur (dans ce cas, créer un graphique d'objet à partir d'un fichier XML que vous avez créé et l'afficher à l'écran) contrôlent le cycle de vie des objets qu'il crée. Dans ce cas, l'activité le possède et j'imagine que c'est dans la portée seulement tant qu'elle est visible. De même, votre objet écouteur est dans la portée tant qu'il y a une référence à celui-ci. – Rich