学习Android过程中,集成了Retorfit2,遇到了请求服务器返回报文赋值为空得问题
要做的事情很简单,使用Retrofit发送请求到服务器,服务器返回json,客户端解析字段。
但是使用过程中出现了一个问题,使用Android安装到手机(虚拟机和实体机),调试得时候是正常的,但是打包安装到手机后会出现,请求服务器返回之后,取json字段,值为空得情况,假设服务器返回{"resultCode":"success","resultMessage":"消息"},但是调用response.body()获取到实体类后,属性都是null。
Log这一行打印会出现Result(resultCode=null,resultMessage=null)
这是赋值没有成功。分析了一下是不是实体类得原因,但是我得字段和报文体是一致的 ,抱着试试得想法在data类加了@SerializedName,结果还是不行。
最后排查得出原因是因为,开了代码混淆,
需要在proguard-rules.pro文件中加入混淆配置
#retrofit2 混淆
-dontwarnjavax.annotation.**
-dontwarnjavax.inject.**
# OkHttp3
-dontwarnokhttp3.logging.**
-keep class okhttp3.internal.*{*;}
-dontwarnokio.**
# Retrofit
-dontwarnretrofit2.**
-keep class retrofit2.* { *; }
-keepattributesSignature
-keepattributesExceptions
# Gson
-keepattributesEnclosingMethod
-keep class com.dh.notice.net.*{*;}# 自定义数据模型的bean目录
# RxJava RxAndroid
#-dontwarn sun.misc.**
#-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
# long producerIndex;
# long consumerIndex;
#}
#-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
# rx.internal.util.atomic.LinkedQueueNode producerNode;
#}
#-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
# rx.internal.util.atomic.LinkedQueueNode consumerNode;
#}
根据网友们得填坑经验,Retrofit官方只提供了Retrofit得混淆配置,但是因为集成了Okhttp和Gson,所以这两个也需要添加。