Я новичок как в Kotlin, многопоточности, так и в android студии. Я использую зависимость okhttp3
для вызова API. Вызов выполняется с URL-адресом, который частично определяется пользовательским вводом в пользовательском интерфейсе. Поэтому я хочу проверить ответ в случае ошибки пользователя.
Пользователя просят ввести последовательность из 9 целых чисел, которая представляет его или ее идентификатор игрока в базе данных, с которой обращается приложение. Одна из возможных ошибок, которая может произойти, заключается в том, что пользователь вводит идентификатор пользователя длиной 9 символов, но не содержит каких-либо определенных c данных, которые я ищу.
Текущий код Kotlin (в MainActivity) для проверки введенного пользователем идентификатора игрока, который происходит в вызове, выглядит следующим образом:
private fun fetchShipIDJson() {
println("Attempting to fetch Ship name JSON")
val shipIdURL = "http://api.worldofwarships.eu/wows/ships/stats/?application_id= APPLICATION ID REMOVED &in_garage=1&account_id=$playerId"
val shipIdRequest = Request.Builder().url(shipIdURL).build()
//Ship ID call
okHttpClientVar.newCall(shipIdRequest).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
println("failed to execute ship ID request")
}
override fun onResponse(call: Call, response: Response) {
println("ship ID request completed successfully")
shipIdBody = response?.body?.string()
//Incorrect player ID input gives Null data
if (shipIdBody?.contains("\"$playerId\":null}")!! || shipIdBody?.contains("\"$playerId\": null}")!!) {
println("first exception condition met")
runOnUiThread {
giveUserInputFeedback("playerId returns null data or does not exist", 1)
}
}
etc.
когда пользователь вводит: «123456789» задается в виртуальной машине, журнал распечатывает » выполнено первое исключительное условие ". Поэтому я прихожу к выводу, что поток правильный.
Наконец, проблема заключается в следующем: чтобы вызвать мою функциональность, чтобы предоставить пользователю обратную связь, я должен позвонить runOnUiThread
, потому что код ломается, потому что: «Только исходный поток, создавший иерархию представлений, может касаться его представлений». происходит иначе.
Однако runOnUiThread
, похоже, ничего не делает и ни к чему не приводит.
Я также заменил в коде полное выражение лямбда-выражения, но оно, похоже, не работает.
runOnUiThread(object : Runnable { override fun run() { println("testing complete runnable expression instead of lambda") } })
Как я могу обойти это, чтобы я мог вызвать свою giveUserInputFeedback()
функцию при возникновении исключения встречается?