Próbuję utworzyć żądanie HTTP w Androidzie, używając Kotlin, i natknąłem się na dwa sposoby.Wywołanie API nie działa wewnątrz Anko Async
Jednym z nich jest tradycyjny sposób, używając AsyncTask
(naprawdę nie całkiem), które mam do pracy z następującego kodu (tylko doInBackground
, jak reszta klasy wydawało zbędne):
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
}
Teraz Natknąłem się na bibliotekę o nazwie Anko, o której wielu tutaj wie, i próbowałem użyć jej DSL do zadań asynchronicznych. Chodzi o to, że nie znalazłem tu zbyt wielu informacji o Anko dla zadań asynchronicznych, więc pomyślałem, że otworzę nowy temat, aby sprawdzić, czy ktoś może mnie nie wyprowadzić z tego, co robię źle, lub co sądzą, że powinienem zrobić, aby to działało.
Kod chciałem użyć to:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
async() {
val result = URL("myUrl").readText()
textView1.setText(result)
}
}
Starałem się zachować go jako szczupły, jak to możliwe, tak aby zminimalizować ewentualne błędy, ale muszę robić coś złego tutaj ponieważ kod w kasecie Blok async nic nie robi, ale aplikacja nie ulega awarii i nie dostaję żadnych wyjątków. Próbowałem debugowania go przy użyciu Intellij IDEA, ale po pierwszym wierszu wewnątrz bloku asynchronicznego zatrzymało debugowanie, mówiąc "Aplikacja jest uruchomiona". Domyślam się, że zawiesił się gdzieś w pierwszej linii z powodu nieudanego połączenia, ale nie wiem.
Próbowałem również użyć zwykłego URL("myUrl").openConnection()
wewnątrz bloku asynchronicznego, ale to też nie zadziałało.
W każdym razie, każda pomoc będzie głęboko doceniona.
Właściwie, byłem w stanie zaktualizować textView1 z uiThread i asynchronicznego wątku, więc to nie jest problem, chociaż sposób w jaki to umieściłeś jest właściwym sposobem na jego użycie. –