Aller au contenu

Structure globale d’une application devant gérer une connexion à un serveur


Fractal

Recommended Posts

Bonjour,

Je suis en train de développer ma première application Android (et c’est aussi à peu près la première fois que je fais du Java), et j’ai quelques problèmes à comprendre quelle doit être la structure globale (en tant qu’Activités, Services, Threads) de mon application.

Voici une version simplifiée de ce que mon programme (un jeu multijoueur en ligne) est censé faire :

  • Au démarrage, afficher un écran de connexion (où on peut choisir son pseudo, etc…) avec un bouton « Se connecter »
  • Quand on clique sur le bouton, une barre de chargement apparaît, puis le programme se connecte au serveur, attend que le serveur lui dise OK, et démarre le jeu
  • Ensuite la partie du programme qui gère le jeu doit pouvoir communiquer (dans les deux sens) avec le serveur auquel on vient de se connecter

Voici ce que j’ai fait (ou que je compte faire) pour l’instant :

J’ai deux activités ConnectionScreen et GameScreen, ainsi qu’un service NetworkService (il est hors de question d’utiliser AsyncTask pour se connecter au serveur, car la connexion est censée perdurer pour le jeu, et il semblerait que les « Bound services » soient ce qu’il faut utiliser).

  • Quand on appuie sur le bouton « Se connecter », l’activité ConnectionScreen se lie au service (bindService()) NetworkService.
  • Le service NetworkService démarre un thread NetworkThread dès que quelqu’un se lie à lui (s’il n’a pas déjà été lancé).
  • Au démarrage, le NetworkThread tente de se connecter au serveur
  • Dans la fonction onServiceConnected du ServiceConnection utilisé par ConnectionScreen, on récupère le NetworkThread lancé par le service (avec une fonction getNetworkThread, un peu comme dans la doc), et on appelle la fonction networkThread.registerConnectionScreen(this), qui permet au NetworkThread de discuter avec l’écran de connexion (en gros, il y a une variable de type ConnectionScreen dans les champs de NetworkThread, et registerConnectionScreen permet de l’initialiser)
  • Dans le NetworkThread, quand la connexion est établie, la fonction connectionScreen.setConnected(true) est appellée (le connectionScreen est celui qui s’est enregistré à l’étape précédente)
  • Je ne suis pas sûr que la fonction setConnected(true) puisse démarrer immédiatement l’activité GameScreen, parce que ce n’est pas le « UI Thread » qui l’appelle, donc je crée une AsyncTask dans la fonction onCreate de ConnectionScreen qui vérifie périodiquement si la fonction setConnected(true) a été appellée, et si c’est le cas il démarre l’activité GameScreen.
  • Ensuite, le GameScreen se lie au NetworkThread, et s’enregistre auprès de lui pour que le NetworkThread puisse appeller directement des méthodes de GameScreen et réciproquement.

A priori ça me semble pouvoir marcher, mais c’est assez compliqué, donc je me demandais s’il ne pouvait pas y avoir plus simple.

De plus, il y a certaines choses dont je ne suis pas sûr, par exemple est-ce que le NetworkService ne risque pas d’être tué quand l’activité ConnectionScreen est stoppée (lorsque GameScreen est démarrée) ?

Merci pour vos remarques, commentaires, conseils, etc :)

PS : C’est sans doute évident pour tout le monde, mais je ne veux pas juste une application qui marche, je veux une application qui marche en faisant les choses de la manière la plus propre possible ^^

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...