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 :

DoInBackground AsyncTask : Changer le type de retour


Sujet :

Android

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Points : 625
    Points
    625
    Par défaut DoInBackground AsyncTask : Changer le type de retour
    Bonjour,

    Habituellement développeur en C# WindowsForm, je me suis mis très récemment au développement Android (toujours en c#) avec Xamarin.

    L'application sur laquelle je bosse doit pouvoir récupérer des données d'une base de données SQL Server.
    Après quelques lectures sur différents forums, j'ai décidé de communiquer via service web REST.

    J'ai créé mon service (projet windows MVC qui fonctionne) et après quelques tâtonnements j'ai découvert la classe AsyncTask dont j'ai pompé la syntaxe c# et y ai intégré mon bout de code que voici :
    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
    44
    45
    public class ServiceWeb_DataTable : AsyncTask
        {
            MainActivity _activite;
            string _url = string.Empty;
     
            public ServiceWeb_DataTable(MainActivity activite, string url)
            {
                _activite = activite;
                _url = url;
            }
     
            protected override void OnPreExecute ()
            {
                //base.OnPreExecute ();
            }
     
            protected override Java.Lang.Object DoInBackground (params Java.Lang.Object[] @params)
            {
                DataTable tmpDatatable = new DataTable ();
                System.IO.Stream maIS;
     
                try
                {
                    HttpURLConnection urlConnection = null;
                    URL url;
                    url = new URL(_url);
                    urlConnection = (HttpURLConnection) url.OpenConnection();
                    urlConnection.SetRequestProperty("Content-Type", "application/xml");
                    urlConnection.Connect();
     
                    maIS = urlConnection.InputStream;
                    tmpDatatable.ReadXml(maIS);
                }
                catch 
                {
                }
     
                return tmpDatatable;
            }
     
            protected override void OnPostExecute (Java.Lang.Object result)
            {
                base.OnPostExecute (result);
            }
        }
    Le compilateur me renvoie un message du style :
    Impossible de convertir implicitement le type 'System.Data.DataTable' en 'Java.Lang.Object'
    J'ai tenté de remplacer le type de sortie "Java.Lang.Object" par "DataTable" mais le compilateur à présent j'obtiens :
    Error CS0508: 'ServiceWeb_DataTable.DoInBackground(params Object[])'*: le type de retour doit être 'Object' pour correspondre au membre substitué 'AsyncTask.DoInBackground(params Object[])'
    J'ai vu qu'en Java on n'a pas ce problème, donc on peut définir d'autres types (en entrée comme en sortie).
    Malheureusement, j'ai eu beau changer les types dans tous les sens, rien n'y fait.

    Suis-je obligé de renvoyer une chaine de caractères (XML) représentant mon DataTable ou est-il possible de renvoyer (proprement) un autre type ? Ou de caster mon datatable en Java.Lang.Object ?

    Merci d'avance pour votre aide.
    "Essayer est le premier pas vers l'Echec !" (Homer Simpson)

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Mes souvenirs de C# sont lointains.... mais il me semblait bien qu'il existait aussi les "generics" en C# (et avec une syntaxe sensiblement identique à Java)...

    La version C# de AsyncTask ne propose pas les types générique comme la version Java ?

    Un truc genre
    AsyncTask<TypeDeMesParametres,TypeProgression,TypeRetourDoInBackground>
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Points : 625
    Points
    625
    Par défaut
    Salut,
    J'ai bien vu qu'en java c'etait faisable et ai tenté de faire pareil, mais soit cela n'existe pas soit je n'ai pas trouvé la bonne syntaxe en c#. Et impossible de trouver un exemple en c# les exemples sont tous en java :'(
    "Essayer est le premier pas vers l'Echec !" (Homer Simpson)

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    D'après ce post

    https://forums.xamarin.com/discussio...g-an-asynctask

    il vaux mieux utiliser les mécanises c#async / await. J'ignore ce que c'est mais visiblement xamarin les comprends mieux que le asynctask qui aurait peu d'intérêt pour les devs c#

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Points : 625
    Points
    625
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    D'après ce post

    https://forums.xamarin.com/discussio...g-an-asynctask

    il vaux mieux utiliser les mécanises c#async / await. J'ignore ce que c'est mais visiblement xamarin les comprends mieux que le asynctask qui aurait peu d'intérêt pour les devs c#
    Danke schöne tchize ^^,
    je m'étais obstiné à chercher dans les asynctask car c'était dans tous les exemples pour la récupération des services web. (j'aurais pu prendre simplement les threads que je connais bien mais quand on a des œillères... ^^)
    Finalement, en suivant la discution sur le lien que tu m'as donné je suis tombé sur les "Tasks" que je n'avais pas encore exploré dont voici un lien Kro$oft :
    https://msdn.microsoft.com/en-us/library/dd537613.aspx

    Pour ceux que ça intéresse, voici mon bout de code pour récupérer des données typées via un service web REST :

    Ma classe Service_Web :
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    public class Service_Web
    	{
    		public static string Recup_Chaine_ServiceWeb(string URL_ServiceWeb)
    		{
    			string retour = string.Empty;	
    			System.IO.Stream maIS;
     
    			try
    			{
    				HttpURLConnection urlConnection = null;
    				URL url;
    				url = new URL(URL_ServiceWeb);
    				urlConnection = (HttpURLConnection) url.OpenConnection();
    				urlConnection.SetRequestProperty("Content-Type", "application/xml");
    				urlConnection.Connect();
     
    				maIS = urlConnection.InputStream;
     
    				BufferedReader rd = new BufferedReader(new Java.IO.InputStreamReader(maIS));
    				string ligne = string.Empty;
    				while((ligne = rd.ReadLine()) != null)
    				{
    					retour += ligne;
    				}
    			}
    			catch (Exception ex)
    			{
    				// a faire...
    			}
     
    			return retour;		
    		}
     
    		public static DataTable Recup_DataTable_ServiceWeb(string URL_ServiceWeb)
    		{
    			DataTable retour = new DataTable();	
    			System.IO.Stream maIS;
     
    			try
    			{
    				HttpURLConnection urlConnection = null;
    				URL url;
    				url = new URL(URL_ServiceWeb);
    				urlConnection = (HttpURLConnection) url.OpenConnection();
    				urlConnection.SetRequestProperty("Content-Type", "application/xml");
    				urlConnection.Connect();
     
    				maIS = urlConnection.InputStream;
    				retour.ReadXml(maIS);
    			}
    			catch (Exception ex)
    			{
    				// a faire...
    			}
     
    			return retour;		
    		}
    	}
    Mes appels depuis la classe MainActivity :
    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
     
    protected override void OnStart ()
    		{
    			string retour_Chaine = string.Empty;
    			DataTable retour_DataTable = null;
     
    			monAlerte = new AlertDialog.Builder (this).Create ();
     
    			base.OnStart ();
     
    			Task<string> maTaskChaine = Task<string>.Factory.StartNew (() => {
    				return Reseau.Service_Web.Recup_Chaine_ServiceWeb ("http://LeServiceWeb/api/bidule");
    			});
     
    			Task<DataTable> maTaskDataTable = Task<DataTable>.Factory.StartNew (() => {
    				return Reseau.Service_Web.Recup_DataTable_ServiceWeb ("http://LeServiceWeb/api/bidule");
    			});
     
    			retour_Chaine = maTaskChaine.Result;
    			retour_DataTable = maTaskDataTable.Result;
     
    			monAlerte.SetMessage (retour_Chaine);
    			monAlerte.Show ();
    		}
    "Essayer est le premier pas vers l'Echec !" (Homer Simpson)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 19
    Dernier message: 12/12/2007, 15h00
  2. comment changer le type d'une relation ?
    Par mitapi dans le forum Access
    Réponses: 5
    Dernier message: 21/05/2007, 10h29
  3. [Débutant] Changer le type d'une colonne
    Par david71 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 08/11/2005, 11h26
  4. [type de retour pour un update]
    Par viny dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 21/03/2005, 21h08
  5. [type de retour dans une proc]
    Par viny dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 19/03/2005, 14h35

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