Я пишу свое первое приложение на Kotlin, так что я довольно новичок в этом. Одной из функций, которую он выполняет, является чтение чего-либо из API, а затем обновление экрана в зависимости от результата.
Я много чего перепробовал с сопрограммами, но, похоже, ничего не работает.
Например, у меня есть что-то вроде этого:
private fun readAPI() {
runBlocking {
fun rAPI() = async {
val api = "..."
result = URL(api).readText()
}
println(tag, "Result: " + rAPI().await())
}
}
И много разных подходов. Ничто не похоже на работу. В приведенном выше случае я получаю исключение "android.os.NetworkOnMainThreadException".
Единственное, что до сих пор работало, это что-то, использующее OkHttp3, как описано здесь: https://rstopup.com/como-hacer-una-solicitud-a-la-api-de-kotlin.html (это на испанском, но вы поймете идею), и это работает, оно дает ответ API, Я анализирую его, заполняю базу данных sqlite3 и так далее. Но, поскольку я не знаю, когда закончится API, я не могу обновить элементы управления экраном. И если я пытаюсь сделать это последовательно, я получаю исключение, что только поток, который запустил действие, может обновить действие или что-то в этом роде.
Я видел и следую МНОЖЕСТВУ учебных пособий, в которых говорится о функциях приостановки, запуска и т. Д., И они пытаются имитировать вызов API с помощью delay()
, эти учебные пособия работают отлично, пока я не попытаюсь создать настоящий API звоните.
Итак, можете ли вы привести мне полный пример того, как вызвать API с Kotlin, а затем обновить некоторые элементы экрана?
EDIT
Я редактирую, изменяя веселье по val:
runBlocking {
val rAPI = async {
val api = "..."
URL(api).readText()
}
Log.w(tag, rAPI.await())
}
Я получил исключение "android.os.NetworkOnMainThreadException".