“Thread déjà commencé” lors de la reprise de l'activité
Voici ma situation:
Je suis la construction d'un jeu pour android et mon activité du jeu est composé d'une coutume surfaceView qui a un fil pour le jeu de logique et de rendu. L'architecture est similaire à la LunarLander démo à partir du site web de Google.
Lorsque l'activité commence, il crée le surfaceView et les appels de cette méthode:
@Override
public void surfaceCreated(SurfaceHolder holder)
{
renderThread.start();
}
Lorsque j'appuie sur le bouton home pour quitter le jeu, le onPause() la méthode est appelée, qui appelle surfaceDestroyed(). Dans surfaceDestroyed j'ai arrêter le jeu Thread en appelant:
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
synchronized(holder)
{
renderThread.stop();
}
}
L'application va à l'arrière-plan de l'amende. Puis, quand j'ai relancer l'application en appuyant sur l'icône, j'obtiens un "Thread déjà commencé" message dans le journal avec un "force close" popup sur l'écran. Ce message se produit lorsque l'activité entre dans le "surfaceCreated" méthode lors de l'appel à la méthode start() sur le thread de rendu.
Maintenant que j'ai regardé en elle pendant des heures et ne peut pas comprendre pourquoi cela est. Je crois que mon fils est arrêté quand j'ai fermer l'application, donc je ne comprends pas pourquoi il dit qu'il a déjà commencé.
OriginalL'auteur NioX5199 | 2010-06-30
Vous devez vous connecter pour publier un commentaire.
Ces méthodes ne font pas ce que vous pensez qu'ils font. À partir de la Doc API:
Et:
Si vous souhaitez interrompre un thread, vous devez utiliser
Object.wait()
etObjecft.notifyAll()
depuis le thread.non, join() de ne pas arrêter le fil soit, il attend qu'elle se termine sur son propre. Vous obtenez le message d'erreur parce que le Fil est déjà commencé. Threads pas "arrêter" et redémarré. Comme je l'ai écrit: pour faire un thread pause jusqu'à ce qu'une condition est remplie, vous utiliser l'Objet.wait().
Il ne devrait probablement pas le faire de cette façon. Recréer le fil est probablement la meilleure approche.
Ok merci. Comme une solution de contournement-je vérifier l'état du thread avant de redémarrer et si son statut est RÉSILIÉ, je viens de le recréer. Je ne suis pas sûr si c'est vraiment ce que je veux faire ici.
veuillez partager le code de vérification de fil d'état. Ayant le même problème.
OriginalL'auteur Michael Borgwardt
À mon avis, vous ne devriez pas emballer votre code dans une sous-classe de Thread si vous avez l'intention de démarrer et d'arrêter le Thread souvent (les exemples de le faire parce que ça rend le code plus court). Utiliser un Exécutable à la place. De cette façon, vous pouvez arrêter et jeter l'ancien Fil quand vous voulez et créer un nouvel objet Thread pour exécuter l'Exécutable lorsque vous avez besoin pour commencer à nouveau.
Aussi, en s'appuyant sur les exceptions est mauvais. Qui devrait être utilisé qu'en dernier recours, quand votre propre code se comporte de manière inattendue.
OriginalL'auteur Torben
Une mauvaise solution, mais il fonctionne..
corrections sont chaleureusement accueillis.
OriginalL'auteur AZ_