Синхронный запрос с залпом в котлине - PullRequest
0 голосов
/ 13 мая 2019

Я написал следующий код с kotlin в Android Studio для выполнения синхронного запроса. Я адаптировал код Java из этого вопроса . У меня сейчас две проблемы:

  1. Каждый запрос приводит к сообщению «Неожиданный код ответа 404 для ...». Когда я звоню URL с почтальоном, это работает. И это также работает с асинхронным вызовом.

  2. Сообщение регистрируется мгновенно, но полная (ложная) функция вызывается только после 30-секундного тайм-аута. Я также попробовал пользовательский ErrorListener, но он также был запущен после тайм-аута.

У кого-нибудь есть идея, почему появляется 404? И в случае возникновения ошибки из-за другой проблемы было бы хорошо, если бы функция complete () вызывалась мгновенно, а не через 30 секунд. Как я могу это сделать?

fun loadUserData(context: Context, complete: (Boolean) -> Unit) {

    val future: RequestFuture<JSONObject> = RequestFuture.newFuture()

    val getUserDataRequest = object: JsonObjectRequest("$URL_GET_USER_DATA/${App.sharedPreferences.userId}", JSONObject(), future, future) {
        override fun getHeaders(): MutableMap<String, String> {
            val headers = HashMap<String, String>()
            headers.put("Authorization", "Bearer ${App.sharedPreferences.authToken}")
            return headers
        }
    }

    App.sharedPreferences.requestQueue.add(getUserDataRequest)

    try {
        val response: JSONObject = future.get(30, TimeUnit.SECONDS)
        userName = response.getString("name")
        userEmail = response.getString("email")
        complete(true)
    } catch (e: InterruptedException) {
        Log.d("REQUEST", "EXC: " + e.localizedMessage)
        complete(false)
    } catch (e: ExecutionException) {
        Log.d("REQUEST", "EXC: " + e.localizedMessage)
        complete(false)
    } catch (e: TimeoutException) {
        Log.d("REQUEST", "EXC: " + e.localizedMessage)
        complete(false)
    } catch (e: JSONException) {
        Log.d("JSON", "EXC: " + e.localizedMessage)
        complete(false)
    }
}
...