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 :

Aide callback MainActivity


Sujet :

Android

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 82
    Points : 47
    Points
    47
    Par défaut Aide callback MainActivity
    Bonjour,
    J'essaye de faire un callback d'une fonction asynchrone en partant de cette exemple:
    https://gist.github.com/cesarferreir...a8d64f9753b4da
    Ma fonction de callback est bien rappelée à la fin du traitement mais dans cette fonction je veux relancer ma reconnaissance vocale (Speechrecognizer)
    Seulement j'ai une exception qui indique que le Speechrecognizer de peut etre utilisé que dans le thread principal.

    Si je comprends bien, ma fonction callback n'est donc pas sur le thread d'origine ?

    Merci

  2. #2
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Ce serait mieux avec ton code.
    Mais au vu de l'exemple : non, clairement pas. Le callback semble réaliser dans une Task, donc dans un autre processus, de manière asynchrone.
    Pour réaliser ton opération sur le main thread, regarde la méthode Activity#runOnUiThread()
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 82
    Points : 47
    Points
    47
    Par défaut
    J'ai regardé runOnUI mais je galère et j'ai la même erreur. Ce que je veux faire c'est lancer une requete web asynchrone et quand elle a fini appeler une fonction callback dans mon thread principal.

    Le code du traitement asynchrone


    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
     
     
    public class WebRequests extends AsyncTask<String, Integer, Void>
    {
     
        private OnEventListener<String> mCallBack;
        private Context mContext;
     
        //*********************************************************************************************
        //  CONSTRUCTOR
        //*********************************************************************************************
     
        public WebRequests(Context context, OnEventListener callback) {
            mCallBack = callback;
            mContext = context;
        }
     
        //*********************************************************************************************
        //  GET REQUEST
        //*********************************************************************************************
     
        protected Void doInBackground(String... Url_asked)
        {
     
            try
            {
                String Url_temp = Url_asked[0];
                URL url = new URL(Url_temp);
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                try {
                    InputStream in = new BufferedInputStream(urlConnection.getInputStream());
                    readStream(in);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    urlConnection.disconnect();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
     
        //*********************************************************************************************
        //  READ STREAM
        //*********************************************************************************************
     
        private void readStream(InputStream in) {
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new InputStreamReader(in));
                String line;
                String AnswerComplete="";
                while ((line = reader.readLine()) != null) {
                    System.out.println(line);
                    AnswerComplete = AnswerComplete + line;
                }
                mCallBack.WebAnswer(AnswerComplete);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
     
    }
    le main activity avec mon callback et le lancement du thread

    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
     
     
       private class ServiceHandler {
            public void run() {
                MainActivity.this.runOnUiThread(new Runnable() {
     
                    @Override
                    public void run() {
     
                        Resources resources=getResources();
                        WebRequests WebRequest = new WebRequests(context, new OnEventListener<String>() {
                            @Override
                            public void WebAnswer(String result) {
                                test(result);
                            }
                        });
                        String[] XmlWebRequests = resources.getStringArray(R.array.ActionsCommandsArray);
                        WebRequest.execute(XmlWebRequests[0]);
                    }
     
                });
            }
        }
     
     
        public void test(String result)
        {
            try {
                startListening(null);
                cdeResults.setText(result);
            } catch (Exception e) {
     
                e.printStackTrace();
            }
        }
     
        private ServiceHandler mHandler;
    et plus loin le lancement dans mon main activity

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                            ServiceHandler sh = new ServiceHandler();
                            sh.run();

  4. #4
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Donc...
    Tu crées un handler pour réaliser en asynchrone une AsyncTask, en demandant explicitement que l'AsyncTask se réalise sur le main thread, rendant inutile et le handler et l'AsyncTask.

    Je te conseille de lire sérieusement la doc d'AsyncTask car tu n'as pas besoin d'autre chose.
    Optionnel : tu calibres ton envoi dans le onPreExecute.
    Tu réalises ta requête dans le doInBackground (et tu calibres au préalable ta requête si pas déjà fait).
    Tu utilise onPostExecute pour réaliser les actions suivant le traitement.

    Bien entendu, avant tout ça, tu lis et comprends la documentation et l'utilisation de la classe AsyncTask
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 82
    Points : 47
    Points
    47
    Par défaut
    oui je me suis pas mal mélangé les pinceaux.
    En fait j'avais utilisé l'async comme dans la doc au debut avec le post etc... mais impossible de revenir dans une fonction du MainActivity. D'où mon post.

    Du coup j'ai enfin réussi avec un delegate (Merci de m'avoir fait retourner aux bases de l'async)

    donc l'async

    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
     
    public class WebRequests extends AsyncTask<String, Integer, String>
    {
     
        public AsyncResponse delegate = null;
     
        //*********************************************************************************************
        //  GET REQUEST
        //*********************************************************************************************
     
        protected String doInBackground(String... Url_asked)
        {
     
            try
            {
                String Url_temp = Url_asked[0];
                URL url = new URL(Url_temp);
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                try {
                    InputStream in = new BufferedInputStream(urlConnection.getInputStream());
                    return readStream(in);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    urlConnection.disconnect();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
     
        //*********************************************************************************************
        //  POST TREATMENT
        //*********************************************************************************************
     
        protected void onPostExecute(String result)
        {
            delegate.WebFinish(result);
        }
    l'interface

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface AsyncResponse {
        void WebFinish(String output);
    }
    l'appel dans MainActivity

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            WebRequests WebRequest = new WebRequests();
            WebRequest.delegate=this;
            WebRequest.execute(XmlWebRequests[idx]);
    et l'overwrite du callback dans le MainActivity

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        @Override
        public void WebFinish(String output){
            startListening(null);
        }
    merci

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

Discussions similaires

  1. [WD20] aide fRepCopie + callback
    Par jjacques68 dans le forum WinDev
    Réponses: 20
    Dernier message: 17/10/2017, 08h34
  2. [Objective-C] Aide pour implémenter le callback, et le delegate
    Par Gustry dans le forum Objective-C
    Réponses: 3
    Dernier message: 08/11/2010, 14h54
  3. Aide Java Threading Longue operation callback
    Par irnbru dans le forum Général Java
    Réponses: 6
    Dernier message: 25/02/2009, 11h17
  4. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05
  5. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

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