«Разрешенный» Retrofit с Kotlin не вызывает enqueue - PullRequest
1 голос
/ 30 сентября 2019

[Пожалуйста, проверьте обновление 2]

Я пытаюсь осуществить модернизацию с Kotlin. Пожалуйста, посмотрите на следующий код:

Вот основной метод модернизации, который должен получить пользователь из API (Webservice):

const val BASE_URL = "https://jsonplaceholder.typicode.com"

fun getUser(userId: Int){
    val loggingInterceptor = HttpLoggingInterceptor()
    loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
    val client = OkHttpClient.Builder()
        .connectTimeout(60, TimeUnit.SECONDS)
        .writeTimeout(60, TimeUnit.SECONDS)
        .readTimeout(60, TimeUnit.SECONDS)
        .addInterceptor(loggingInterceptor)
        .build()

    val retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .client(client)
        .addConverterFactory(GsonConverterFactory.create())
        .build()

     val user = retrofit.create(Api::class.java)

        val userObject : Call<ResponseBody> =  user.getUser(userId)

        userObject.enqueue(object : Callback<ResponseBody>{
            override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
                e(javaClass.simpleName, "loginResponse: $call")
                e(javaClass.simpleName, "loginResponse: ${t.printStackTrace()}")
            }

            override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
                e(javaClass.simpleName, "loginResponse: ${response.raw()}")
                e(javaClass.simpleName, "loginResponse: ${response.code()}")
                e(javaClass.simpleName, "loginResponse: ${response.message()}")
            }

        })

}

API-интерфейс:

interface Api {

    @GET("users/{id}")
    fun getUser(
        @Path("id") id: Int
    ): Call<ResponseBody>
}

Теперь проблема заключается в методе обратного вызова enqueue, onResponse и onFailure не печатает никаких журналов. Но я получаю логи, запрос Http успешен от OkHttpClient. Если я использую эквивалентный код Java, все работает просто отлично. Я провел целый день в поисках решения. и пробовал разные подходы, но ничего не получается. Любая помощь приветствуется.

ОБНОВЛЕНИЕ:

На данный момент я использую его эквивалентный код Java следующим образом, который прекрасно работает:

    userObject.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(@NotNull Call<ResponseBody> call, @NotNull Response<ResponseBody> response) {
            e(TAG, "loginResponse: " + call);
            e(TAG, "loginResponse: " + response.string());

        }

        @Override
        public void onFailure(@NotNull Call<ResponseBody> call, @NotNull Throwable t) {
            e(TAG, "loginResponse: " + call);
            e(TAG, "loginResponse: ", t);
        }
    });

Хотя яЕсли оставить этот вопрос нерешенным, кто-то может найти / узнать решение для него. Или, если я найду это в будущем, я обновлю это.

ОБНОВЛЕНИЕ 2

Это была глупая ошибка, или я даже не могу сказать, что это была ошибка,На самом деле произошло то, что журналы не печатались этими методами. Но когда я поместил Toast в эти методы, он отобразил тост с ответом.

Итак, я узнал, что журналы Android не всегда надежны, поэтому, когда вы застряли с журналами, всегда пытайтесьи использовать тосты или методы интерфейса. Так что это ответ на мой вопрос.

Но кто-нибудь может сказать мне, почему эти журналы не распечатаны, это тоже было бы очень полезно.

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Я протестировал ваш код и должен был внести некоторые изменения, чтобы он работал.

Сначала я должен был определить свой собственный класс data class ResponseBody(val id: Int, val name: String) (мне было лень добавлять все поля). Это не сработало, когда я использовал okhttp3.ResponseBody.

. И чтобы напечатать возвращаемые данные, вы должны изменить ${response.message()} на ${response.body()}.

В Javaкод, который вы разместили, вы используете response.string(), который отличается от response.message() в вашем коде Kotlin.

0 голосов
/ 01 октября 2019

Попробуйте определить параметры вашего метода как обнуляемые;

userObject.enqueue(object : Callback<ResponseBody>{
        override fun onFailure(call: Call<ResponseBody>?, t: Throwable?) {
            e(javaClass.simpleName, "loginResponse: $call")
            e(javaClass.simpleName, "loginResponse: ${t.printStackTrace()}")
        }

        override fun onResponse(call: Call<ResponseBody>?, response: Response<ResponseBody>?) {
            e(javaClass.simpleName, "loginResponse: ${response.raw()}")
            e(javaClass.simpleName, "loginResponse: ${response.code()}")
            e(javaClass.simpleName, "loginResponse: ${response.message()}")
        }

    })

Поскольку интерфейс обратного вызова определен в java, эти параметры не равны нулю.

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