【问题标题】:"Resolved" Retrofit with Kotlin does not trigger enqueue使用 Kotlin 进行“已解决”的改造不会触发入队
【发布时间】:2019-09-30 19:46:34
【问题描述】:

[请查看更新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 不打印任何日志。但是我从 OkHttpClient 获得了 Http 请求成功的日志。如果我使用等效的 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 放入这些方法中时,它会显示带有响应的 toast。

所以,我了解到 Android 日志并不总是可靠的,所以当您被日志卡住时,请务必尝试使用 toast 或接口方法。所以这就是我的问题的答案。

但是任何人都可以告诉我为什么这些日志没有打印出来,这也很有帮助。

【问题讨论】:

  • 我正在使用带有 Kotlin 的 Retrofit,它非常好。你得到什么错误?不过你的代码看起来不错。
  • 是的,代码很好,更新了我的帖子,我认为肯定有一些与日志或改造有关的错误。

标签: android kotlin retrofit2


【解决方案1】:

我测试了您的代码,并且必须对其进行一些更改才能正常工作。

首先,我必须定义自己的data class ResponseBody(val id: Int, val name: String) 类(我懒得添加所有字段)。当我使用okhttp3.ResponseBody时它不起作用。

要让它打印返回的数据,您必须将${response.message()} 更改为${response.body()}

在您发布的 Java 代码中,您使用 response.string(),这与您的 Kotlin 代码中的 response.message() 不同。

【讨论】:

  • 谢谢,这看起来很有希望,我会测试一下,让你知道!
  • 听起来不错!如果您遇到更多问题,请告诉我,我会帮助您调试它们!
  • 您好 Enselic,我尝试过这种方式,但 no 不起作用,能否请您添加您尝试过的代码,也许我在某处犯了一些愚蠢的小错误。
  • 这是我的全部代码:pl.kotl.in/r0jGiiNKX 当我运行它时,我在日志中看到:E : loginResponse: ResponseBody(id=1, name=Leanne Graham) 并且名称 Leanne Graham 显然来自 HTTP 响应。希望这也适用于你!我在一个新创建的 Android 项目中运行我的代码。
  • 我已经在我现有的项目中尝试过这段代码,但没有奏效。今晚我将创建一个新的演示项目并检查它是否正常工作。谢谢
【解决方案2】:

尝试将您的方法参数定义为可为空;

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()}")
        }

    })

由于 Callback 接口是在 java 中定义的,因此这些参数不是非空的。

【讨论】:

  • 谢谢你的回答,但是不行,刚试了,不行。
猜你喜欢
  • 2021-05-25
  • 1970-01-01
  • 2020-08-06
  • 2018-05-03
  • 1970-01-01
  • 2015-05-09
  • 2022-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多