【发布时间】: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,它非常好。你得到什么错误?不过你的代码看起来不错。
-
是的,代码很好,更新了我的帖子,我认为肯定有一些与日志或改造有关的错误。