IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Problème de structure application Android


Sujet :

Android

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Problème de structure application Android
    Bonjour à tous,

    j'ai un soucis structurel au niveau de mon appli Android. Je m'explique : j'ai 3 classes pour le moment en plus de mon MainActivity. Voila un schéma de mon projet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    - MainActivity
    - Meteo
    - JsonMeteo
    - Trajet
    - JsonTrajet
    Donc j'ai essayé de scinder le traitement en faisant des Asynctask, et en séparant bien le Json pour avoir un code plus "propre". Cependant arrive un moment où je dois mettre l'ensemble des éléments dans mon MainActivity.

    Et là je ne parviens pas à les "transférer" via des Intents vu que ce sont des listview générées avec Listener. J'ai donc essayé d'afficher les éléments d'une classe (par exemple des infos sur la météo) par le biais du layout activity_main au lieu d'un layout meteo.xml dédié, mais lorsque je refait un intent avec la classe Trajet et d'afficher la liste des trajet dans activity_main, l'affichage des éléments Météo sont effacés bien que dans mon layout ce soit des id différents

    Donc je me pose la question suivante : suis je bien dans le bon sens en essayant de structurer mon appli comme cela où alors dois je mettre tout le code dans mon MainActivity ...

    J'ai eu beau cherché et testé plein de chose via startActivityForResult, des Intents, etc mais je n'ai pas réussi à avoir le résultat distinct de deux classes et donc de deux traitement Json différents et de les mettre sur mon Layout activity_main "en même temps".

    Merci beaucoup de votre aide

  2. #2
    Membre actif Avatar de Altak
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 170
    Points : 245
    Points
    245
    Par défaut
    Bonjour,

    J'avoue avoir du mal a comprendre ton cas...
    Tu as une activity, ok. Mais tes classe meteo, trajet, etc... ce sont quoi? de simple classe, des fragments? d'autre activity?
    Comment tu stock tes données dans ta MainActivity? Tu peux nous montrer un exemple de code qui montre comment tu as essayé de transférer tes données?

    glhf

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Bonjour et merci de me répondre

    Je vais détailler un peu plus : donc dans mon MainActivity j'appelle des classes qui doivent récupérer du contenu Json.
    Donc dans mon MainActivity j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Intent myIntent = new Intent(this, Meteo.class);
    		startActivityForResult(myIntent, 1);
    Dans Meteo.class j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    		protected JSONObject doInBackground(String... args) {
     
    			LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    			Location location = lm
    					.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    			double longitude = location.getLongitude();
    			double latitude = location.getLatitude();
     
    			String urlMeteo = "le lien url pour recuperer le json"
    					+ latitude + "," + longitude + ".json";
     
    			JSONMeteo jMeteo = new JSONMeteo();
     
    			JSONObject strJsonMeteo = jMeteo.getJSONMeteo(urlMeteo);
     
    			return strJsonMeteo;
    		}
                            JSONObject test = strJsonMeteo.getJSONObject("location");
    		        String ville = test.getString("city");
    		        textVille.setText(ville);
    Dans JsonMeteo j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    public JSONObject getJSONMeteo(String urlMeteo) {
    		// Making HTTP request
    		try {
    			// defaultHttpClient
    			DefaultHttpClient httpClient = new DefaultHttpClient();
    			HttpPost httpPost = new HttpPost(urlMeteo);
     
    			HttpResponse httpResponse = httpClient.execute(httpPost);
     
    			HttpEntity httpEntity = httpResponse.getEntity();
    			is = httpEntity.getContent();
    		} catch (UnsupportedEncodingException e) {
    			e.printStackTrace();
    		} catch (ClientProtocolException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		try {
    			BufferedReader reader = new BufferedReader(new InputStreamReader(
    					is, "UTF-8"), 8);
    			StringBuilder sb = new StringBuilder();
    			String line = null;
    			while ((line = reader.readLine()) != null) {
    				sb.append(line + "\n");
    				// System.out.println(line);
    			}
    			is.close();
    			json = sb.toString();
    		} catch (Exception e) {
    			Log.e("Buffer Error", "Error converting result " + e.toString());
    		}
    		// try parse the string to a JSON object
    		try {
    			jObj = new JSONObject(json);
    		} catch (JSONException e) {
    			Log.e("JSON Parser", "Error parsing data " + e.toString());
    		}
    		// return JSON String
     
    		return jObj;
    	}
    C'est le même principe pour l'autre classe trajet et JsonTrajet. Mais le soucis c'est que je n'arrive pas à coordonner les deux exécutions des classes pour m'afficher dans mon Layout ActivityMain le résultat de Meteo et Trajet. J'espère que c'est un peu plus clair En clair si je passe par deux intent successifs ça donne ça :

    MainActivity => Meteo => JsonMeteo => Retour dans Meteo avec setText dans le ActivityMain

    Mais si ensuite je fait la même chose avec Trajet, le contenu du layout ActivityMain (qui contenait les éléments de Meteo) est effacé au profit de Trajet (certainement parce que je change d'activité).

  4. #4
    Membre actif Avatar de Altak
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 170
    Points : 245
    Points
    245
    Par défaut
    Re,

    Je comprend mieux en effet.

    Si tu recré une activity a chaque retour de tes appel réseaux, il est normal que tu perde tes données, tu dois soit les stocker en mémoire en attendant les retours de tout tes appel (dans une classe a part ou en singleton par exemple) ou soit tout envoyer d'un coup a ton activity.

    Sinon, ce que tu peux faire, c'est diviser ton affichage a l'aide de fragment.
    Dans ton main_activity_layout, tu met 2 fragment (l'un pour la meteo, et l'autre pour le trajet). Dans le OnCreate() de ta MainActivity, tu instancie ton MeteoFragment et ton TrajetFragment.
    Dans les onCreate() de tes fragments, tu effectue ton appel réseaux et tu modifie ta vue en fonction de ton retour.

    Avec cette méthode, il se passe plusieurs chose:
    - Ta MainActivity sera TOUJOURS afficher
    - L'affichage de ta météo sera SÉPARÉ de l'affichage de ton trajet, ce seront tes fragment qui géreront de façon autonome l'affichage.

    Ce qui donnerais le schema suivant :
    MainActivity => MeteoFragment => appel réseau => met a jour la vue meteo
    => Trajet Fragment => appel réseau => met a jour la vue trajet
    Les deux appel et la mise a jour de la vue se font en parallèle et de façon indépendante. Cela t’évitera d’écraser tes données.

    Ensuite, si tu souhaite échanger des données entre les fragment, tu peux créer une interfaceet l’implémenter dans ta MainActivity pour pouvoir l'appeler depuis tes fragments.
    Pour ce faire, je t'invite a te renseigner sur les interfaces et la fonction onAttach() des fragments (si ta besoin d'aide, je suis la ). C'est avec des callBack que je fonctionne pour mes AsyncTask et mes Fragments et ca fonctionne plutôt bien.

    Voila voilou, je sais pas si j'ai été assez clair, pour résumer:
    -Si tu recré une activity a chaque retour de tes appel réseaux, il est normal que tu perde tes données, dans ce cas l'utilisation de Fragment pourrait être intéressante.
    -Ca va te faire changer pas mal de truc, si tu ne souhaite ou peux faire les modifications, tu dois faire en sorte de stocker tes données quelque part le temps d'avoir le retour de tes 2 appels réseaux. Et il faut que ta MainActivity puisse y avoir accès.
    -Si tu souhaite faire les changements, regarde la doc sur les fragment, sur les interfaces (pour mettre des callbacks en place) et sur la fonction onAttach() des fragments (pour pouvoir appeler tes callback depuis tes fragments).
    -Les fragments ne sont pas trés complex. Voit ta MainActivity comme un contrôleur et les fragments comme des sous-contrôleurs qui gèrent leur morceau d'affichage de façon indépendante.

    Si ta besoin d'aide, demande

    GLHF

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Vraiment merci beaucoup pour ta réponse rapide et très complète ! Je vais regarder de près les fragments car ça va me permettre d'apprendre de nouvelles choses.

    Merci encore et je te | vous tiens au courant quand j'aurais un code fonctionnel !

Discussions similaires

  1. Problème de cnx BD MySQL avec une application Android
    Par eloumghari.imane dans le forum Android
    Réponses: 2
    Dernier message: 08/01/2014, 19h44
  2. Probléme de connexion d'une application android vers une BD mysql
    Par hajer_baccouch dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 13/05/2012, 00h52
  3. Problème application Android sur Galaxy S2
    Par frimeman dans le forum Android
    Réponses: 2
    Dernier message: 01/08/2011, 01h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo