Android kotlin - вернуть int для "родительской" функции - PullRequest
0 голосов
/ 14 февраля 2020

Это код

private fun like(id: Int): Int{

    val params = RequestParams()
    params.put("id", id)


    val client = AsyncHttpClient()
    client.post("https://www.ttt.com/ttt.php", params, object : JsonHttpResponseHandler()
    {
        override fun onSuccess(statusCode: Int, headers: Array<Header>?, response: JSONArray?)
        {
            return 1
        }
        override fun onFailure(statusCode: Int, headers: Array<Header>?, e: Throwable, response: JSONArray?)
        {
            return 0
        }
    })
}

Как видите, я пытаюсь вернуть 1 или 0 для родительской функции like после получения ответа API, но ошибка:

The integer literal does not conform to the expected type Unit

Я не могу найти похожие вопросы! Как я могу это сделать?

1 Ответ

0 голосов
/ 15 февраля 2020

Поскольку это асинхронный вызов c, и вы переопределяете функцию, которая ничего не возвращает, вы не можете напрямую вернуть int.

Есть 2 варианта:

  • Опция 1: используйте обратный вызов, где вы хотите вернуть int (рекомендуется)
  • Опция 2: оберните вызов asyn c следующим кодом (не рекомендуется, но работает)

Пример варианта 2 (Не рекомендуется. Только для того, чтобы показать, что это можно сделать):

private fun like(id:Int):Int{

var responseFlag = true
var started = false
var result = 0

while(responseFlag){

    if(!started){

        started = true

        val params = RequestParams()
        params.put("id", id)

        val client = AsyncHttpClient()

        client.post("https://www.ttt.com/ttt.php", params, object : JsonHttpResponseHandler(){
        override fun onSuccess(statusCode: Int, headers: Array<Header>?, response: JSONArray?){
            result = 1
            responseFlag = false
        }
        override fun onFailure(statusCode: Int, headers: Array<Header>?, e: Throwable, response: JSONArray?){
            result = 0
            responseFlag = false
        }
    })

    }

}

return result

}


Это будет выполнено один раз и дождаться запроса результат.

Он заблокирует ваш процесс, поэтому это не рекомендуется, поскольку точка асинхронного вызова c должна быть асинхронной.

Также, как сказано в комментариях, вы не должны использовать этот код наBindViewHolder.

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...