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.
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. –