Partage
  • Partager sur Facebook
  • Partager sur Twitter

Android Gmail API et Thread, coroutines, etc

Attendre l'exécution d'une requête pour continuer

    31 octobre 2020 à 21:32:47

    Bonjour à tous,

    Tout d'abord je tiens à préciser que je suis plutôt mauvais en programmation en général. J'écris mon code ligne par ligne en faisant des test et avec un peu de chance ca fini par fonctionner :')

    J'essaie de récupérer une pièce jointe grâce à l'API Gmail (un fichier texte qui me sert de source de donnée) et ensuite manipuler ces données.

    (Gmail API : https://developers.google.com/gmail/api/quickstart/java -> cette partie c'est OK, j'ai bien mon objet "Gmail" qui me permet d'accéder à mon e-mail)

    J'ai fait un exemple avec les "Label" uniquement, pour simplifier (https://developers.google.com/gmail/api/reference/rest/v1/users.labels/list)

    Donc dans l'idée, il faut d'abord que je récupère les données et seulement une fois que c'est fait je peux passer à la suite.

    J'ai essayé comme ca (mService étant mon objet Gmail) :

    (Tout est dans la fonction onCreate de mon activité principale)

            twText.text = "Bonjour"
    
            val listResponse:ListLabelsResponse =  mService.users().labels().list("me").execute()
            val labels:List<Label> = listResponse.labels
            twText.text = labels[1].name
    
            twText.text = "On peut continuer"
    

    Mais j'ai un erreur à l'execution : IllegalStateException: Calling this from your main thread can lead to deadlock.

    Donc j'ai essayé avec un nouveau Thread (et c'est peu être là que j'ai pas tout compris) :

            twText.text = "Bonjour"
    
            val t = Thread {
                Log.d("Test", "T1")
                val listResponse:ListLabelsResponse =  mService.users().labels().list("me").execute()
                Log.d("Test", "T2")
                val labels:List<Label> = listResponse.labels
                 runOnUiThread {
                     twText.text = labels[1].name
                 }
            }
            t.start()
    
            twText.text = "On peut continuer"
            Log.d("Test", "T3")
    

    Là ca "fonctionne" mais évidemment mon action "twText.text = "On peut continuer"" est exécutée avant "twText.text = labels[1].name". Pour l'ordre d'affichage des Log j'ai : T3, T1, T2. (La requête Gmail prend environ 500ms)

    Si je rajoute t.join() après t.start, dans l'idée d'attendre la fin de mon Thread t pour continuer, l'application reste éternellement bloquée au niveau de la requête Gmail. Le Log T1 est affiché, mais pas les autres.

    A la place de t.join() j'ai également essayé :

    - Thread.sleep(2000)

    - Une boucle qui attend que "twText.text" soit égal à labels[1].name

    - Utiliser des coroutines à la place de Thread (genre GlobalScope.launch, runBlocking)

    J'ai à chaque fois le même résultat, si j'essaie de retarder d'une manière ou d'une autre le Thread principal, mon "Log.d("Test", "T2")" n'est jamais exécuté.

    Je dois surement pas voir la bonne approche...

    -
    Edité par AlzecQwertz 31 octobre 2020 à 21:58:35

    • Partager sur Facebook
    • Partager sur Twitter

    Android Gmail API et Thread, coroutines, etc

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown