Kotlin, Android: похоже, что runOnUiThread () не работает при вызове из вызова API okhttp3 - PullRequest
0 голосов
/ 05 августа 2020

Я новичок как в 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() функцию при возникновении исключения встречается?

1 Ответ

0 голосов
/ 05 августа 2020

Вызов API, который вы пытаетесь выполнить, выполняется в другом потоке (в фоновом режиме), когда вы выполняете okHttpClientVar.newCall(shipIdRequest).enqueue здесь enqueue запускает вызов API в фоновом потоке, и пока вы получаете ответ API, пока вы пытаетесь для управления вашим представлением или выполнения некоторой задачи с ответом, который еще не получен, пока вы находитесь в другом потоке, и явно указав runOnUiThread {}. Здесь вы можете получить некоторую ссылку из одного из моих ответов, где вы можете использовать подход обратного вызова для выполнения вашей задачи.

...