2016-05-15 2 views
5

J'essaye de faire une requête http sous Android, en utilisant Kotlin, et j'ai trouvé deux façons de le faire.L'appel d'API ne fonctionne pas à l'intérieur d'Anko Async

L'une est la façon traditionnelle, en utilisant AsyncTask (pas vraiment assez) que je suis arrivé à travailler avec le code suivant (juste le doInBackground, comme le reste de la classe semblait inutile):

override fun doInBackground(vararg params: Void?): String? { 
    val url = URL("myUrl") 
    val httpClient = url.openConnection() as HttpURLConnection 
    if(httpClient.getResponseCode() == HttpURLConnection.HTTP_OK){ 
     try { 
      val stream = BufferedInputStream(httpClient.getInputStream()) 
      val data: String = readStream(inputStream = stream) 
      return data; 
     } catch (e : Exception) { 
      e.printStackTrace() 
     } finally { 
      httpClient.disconnect() 
     } 
    }else{ 
     println("ERROR ${httpClient.getResponseCode()}") 
    } 
    return null 
} 

Maintenant, Je suis tombé sur une bibliothèque appelée Anko, que beaucoup connaissent ici, et j'ai essayé d'utiliser son ADSL pour les tâches asynchrones. Le fait est que je n'ai pas trouvé beaucoup d'informations sur Anko pour les tâches asynchrones, alors j'ai pensé que j'ouvrirais un nouveau sujet pour voir si quelqu'un pourrait me dire ce que je fais de mal ou ce qu'ils pensent que je devrais faire. faire pour le faire fonctionner.

Le code que je voulais utiliser est la suivante:

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    setContentView(R.layout.activity_main) 

    async() { 
     val result = URL("myUrl").readText() 
     textView1.setText(result) 
    } 
} 

J'ai essayé de le garder aussi mince que possible afin de minimiser les erreurs potentielles, mais je dois faire quelque chose de mal ici parce que le code de la Le bloc asynchrone ne fait rien, mais l'application ne plante pas et je ne reçois aucune exception. J'ai essayé de le déboguer en utilisant Intellij IDEA, mais après la première ligne dans le bloc asynchrone, il arrête le débogage en disant "L'application est en cours d'exécution". Ma meilleure supposition est qu'elle a été accrochée quelque part dans cette première ligne en raison de l'échec de la connexion, mais je ne sais pas.

J'ai également essayé d'utiliser le URL("myUrl").openConnection() normal dans le bloc asynchrone, mais cela n'a pas fonctionné non plus.

De toute façon, toute aide serait grandement appréciée.

Répondre

5

Le problème textView1 le contenu n'est pas mis à jour est causée par l'appel setText en dehors de main thread.

The documentation montre un bon exemple comment utiliser correctement async. Jetez un oeil à la version suivante adaptée de votre code:

async() { 
    val result = URL("http://stackoverflow.com/").readText() 
    uiThread { 
     textView1.text = result 
    } 
} 

PS. Bien que pas directement lié à la question envisager d'utiliser un client plus agréable http Retrofit dire, OkHttp

+0

En fait, j'ai été capable de mettre à jour textView1 à partir de uiThread et du thread asynchrone, donc ce n'est pas vraiment le problème, bien que la façon dont vous le mettez soit la bonne façon de l'utiliser. –

0

Le problème avéré être beaucoup plus basique que ce que je pensais. C'était un problème de compatibilité apparemment d'avoir une ancienne version d'Android Studio fonctionnant avec la nouvelle version 1.0.2 du plugin Kotlin et, encore une fois, apparemment la fonction readText ne fonctionnait pas correctement et donc je n'obtenais rien de cela.

Quoi qu'il en soit, j'ai mis à jour Android Studio, avec la dernière version de Kotlin et ça a bien fonctionné, même si je vais voir si c'est ce qui a causé le problème dans readText.