gpt4 book ai didi

android - Retrofit 1.9 原始响应无法在成功回调中处理

转载 作者:行者123 更新时间:2023-11-30 01:42:20 25 4
gpt4 key购买 nike

我的第一个理解是ProGuard导致Retrofit成功回调中无法获取response对象。然而,问题在于 Retrofit 根据日志级别在成功回调中返回原始响应对象(第二个参数)。

请参阅下面我自己的回答。

Google 报告的 IOException:

com.google.a.ae: java.io.IOException: closed at com.google.a.k.a(Unknown Source) at com.google.a.k.a(Unknown Source) at com.myapp.rest.model.ApiResponse.parseResponse(Unknown Source) at com.myapp.service.e.a(Unknown Source) at com.myapp.service.e.success(Unknown Source) at retrofit.CallbackRunnable$1.run(Unknown Source) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:155) at android.app.ActivityThread.main(ActivityThread.java:5696) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823) Caused by: java.io.IOException: closed at c.x.read(Unknown Source) at java.io.InputStreamReader.read(InputStreamReader.java:231) at java.io.BufferedReader.fillBuf(BufferedReader.java:145) at java.io.BufferedReader.read(BufferedReader.java:333) at com.google.a.d.a.b(Unknown Source) at com.google.a.d.a.b(Unknown Source) at com.google.a.d.a.A(Unknown Source) at com.google.a.d.a.o(Unknown Source) at com.google.a.d.a.f(Unknown Source) ... 14 more

异步改造请求:

@POST("/api/myobjects")
void newMyObject(@Body MyObject myObject, Callback<MyObject> cb);

改造成功回调:

public void success(MyObject myObject, Response raw) {
try {
ApiResponse res = ApiResponse.parseResponse(raw);
} catch (IOException | NullPointerException e) {
super.failure(RetrofitError.unexpectedError(raw.getUrl(), e));
}
}

并解析 API 响应:

public static ApiResponse parseResponse(Response response) throws IOException {
final Gson gson = new Gson();
final BufferedReader reader = new BufferedReader(new InputStreamReader(response.getBody().in()));
return gson.fromJson(reader, ApiResponse.class);
}

按照 Retrofit 和 Gson 准则实现 ProGuard:

-dontwarn rx.**
-dontwarn okio.**
-dontwarn jce.**
-dontwarn javax.naming.**

# keep okhttp & retrofit following retrofit guidelines
-dontwarn com.squareup.okhttp.**
-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }

-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keepclasseswithmembers class * {
@retrofit.http.* <methods>; }

# keep gson following google guidelines
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }

# keep application classes that are serialized/deserialized over Gson
-keep class com.myapp.rest.model.** { *; }

# keep the data for stacktraces
-keepattributes *Annotation*
-keepattributes Signature
-keepattributes LineNumberTable
-keepattributes Exceptions

一些进一步的分析表明响应是可用的,但是在解析响应对象时连接已经关闭。下面的日志显示可以检索响应 URL 和状态在 Retrofit 成功回调中。

12-17 10:39:46.639 4192-4192/? I/com.myapp.service.e: https://urlto/api/myobjects?locale=en&app=xxx 12-17 10:39:46.639 4192-4192/? I/com.myapp.service.e: OK 12-17 10:39:46.649 4192-4192/?W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x4208f8e0) 12-17 10:39:46.669 4192-4192/? E/AndroidRuntime: FATAL EXCEPTION: main com.google.gson.ae: java.io.IOException: closed at com.google.gson.k.a(Unknown Source)

最佳答案

经过进一步研究表明,当日志级别不是 FULL 时,Retrofit 的一个已知功能是不返回原始响应主体(读取并关闭输入流)。

参见:https://github.com/square/retrofit/issues/953 (关闭)。我不清楚为什么关闭它,因为第二个参数的行为因日志级别而异。

其他人建议的解决方法是在第一个参数中返回 Response 对象。另一种方法是将日志级别保持在 FULL。

关于android - Retrofit 1.9 原始响应无法在成功回调中处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34308614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com