androidDebutant Posté(e) 3 juillet 2010 Share Posté(e) 3 juillet 2010 Bonjour, Je suis en train de développer un jeu de type "plateforme", mais je rencontre un problème lorsque je quitte et reprend l'application. Tout d'abord j'ai repris la structure de base de LunarLander dans le SDK. Ma première classe extends Activity, et implémente donc les méthodes onCreate(Bundle savedInstanceState) et onSaveInstanceState(Bundle out). Dans la méthode onCreate() la vue est instanciée via setContentView(R.layout.main). La classe de la vue extends SurfaceView et implements SurfaceHolder.Callback. Une classe privée qui hérite de thread est également déclarée dans la classe de la vue. Dans le constructeur de la vue on créé le thread (classe privée). La méthode surfaceCreated(SurfaceHolder holder) permet de mettre un boolean a true dans le thread (qui est utilisé dans run()), et de lancer ce thread (thread.start()). La méthode surfaceDestroyed quant à elle arrête le thread en appelant la méthode join(): System.out.println("surfaceDestroyed"); boolean tryJoin= true; thread.setRunning(false); while (tryJoin) { try { thread.join(); System.out.println("Thread kill"); tryJoin = false; } catch (InterruptedException e) {} } Mon problème est le suivant: Je lance mon application. Celle-ci affiche la map (l'activity est donc bien lancé et le thread a démarré). Maintenant j'appuie sur le bouton HOME. Et je relance mon application en cliquant sur son raccourci. La je reçois un "the application has stopped unexpectedly...". Lorsque je regarde dans le debug, il m'indique que le problème vient d'une exception soulevée par thread.start() dans la méthode surfaceCreated(..). J'ai donc mis des System.out.println() pour voir le cheminement lors de l'execution de l'application. Lorsque que l'application est lancée: + onCreate() (classe qui étends Activity) + constructeur de la vue + constructeur du thread + surfaceCreated (lancement du thread avec start()) Maintenant j'appuie sur le bouton HOME: + onSaveInstanceSave (pour l'instant ne fais rien, mais par la suite devrait sauvegarder les variables) + surfaceDestroyed (termine le thread avec join) + thread killé (affichage après thread.join()) Désormais je relance le jeu depuis le raccourci: + surfaceCreated() => plantage sur thread.start() Donc lorsque je relance l'application on ne recrée pas l'activity ni le thread (pourtant celui-ci a été stoppé lorsque l'on a cliqué sur HOME car on est rentré dans surfaceDestroyed avec thread.join()). Ce que je ne comprend pas c'est que le thread a été stoppé et pourtant l'exception levée est "Thread already started". Si j'avais eu un null pointer exception j'aurais compris mais ce n'est pas le cas. J'ai suivi excatement la structure de Lunar Lander (et même verifié sur JetBoy) dans le SDK. Je ne vois pas ce que je loupe et qui fait planter l'application. Si quelqu'un voit ce qui cloche qu'il n'hésite pas, je suis preneur de tous les conseils. Merci beaucoup, Aurélien Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.