android - Retrofit 2 在生产中返回 null

标签 android retrofit rx-java2

我正在尝试解决 Retrofit 2 在响应中返回 null 的问题。有趣的是,在模拟器中一切正常,接收和显示数据,但是当我构建 APK 时,同样的事情因 NullPointerException 而崩溃。我已经评论了发生这种情况的那一行。

我的 build.gradle 依赖项:

compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'io.reactivex.rxjava2:rxjava:2.1.3'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'

初始化改造:

retrofit = new Retrofit.Builder()
        .baseUrl(<url>)
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .build();

接口(interface):

@GET(<url>)
Flowable<DataResponse> getDataFromApi(@Query("offset") int offset, @Query("limit") int limit);

API 调用:

retrofit
  .getDataFromApi(0, 10)
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(new Subscriber<DataResponse>() {
        @Override
        public void onSubscribe(Subscription s) {
            s.request(Long.MAX_VALUE);
        }

        @Override
        public void onNext(DataResponse dataResponse) {
          // HERE I GET NULL IN PRODUCTION   
        }

数据响应 POJO:

public class ServicesResponse {
  private List<Item> items;

  public List<Item> getItems() {
    return items;
  }
}

混淆器。我已经尝试了几件事,但仍然没有运气。目前看起来像这样:

-dontwarn retrofit2.**
-keep class javax.annotation.Nullable
-keep interface javax.annotation.Nullable
-keep class retrofit2.** { *; }
-keep class com.squareup.okhttp3.** { *; }
-keep interface com.squareup.okhttp3.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-keepclasseswithmembers class * {
  @retrofit2.http.* <methods>;
}
-keepclasseswithmembers interface * {
  @retrofit2.http.* <methods>;
}

感谢您的帮助:)

最佳答案

我总是避免混淆 Retrofit 使用的模型类。否则 AFAIK Gson 无法序列化/反序列化模型:

-keep public class your.package.to.models.** {*;} 

# or

#-keepclassmembers class your.package.to.models.** {
#    public <methods>;
#    <fields>;
#}

关于android - Retrofit 2 在生产中返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46862156/

相关文章:

java - 递归排列字符串无法完成超过 9 个字符 - 抛出 OutOfMemoryError

java - 我可以在Android Studio中的单个耳机上播放声音吗?

android - 为什么在 ListFragment 中调用 setListAdapter 后我的 ListView 为空?

使用 Rx-Java 时,旋转后 Android View 为空

使用 RxJava 处理空查询结果的 Android Room

android - 播放计费库连接和查询sku详情

android - 从 dart 中的某个位置获取一个字符

java - 如何使用 Retrofit 处理 JSON 响应

swift - 如何从响应中获取自定义 header (retrofit 和 rxjava)

android - 如何使用 RxJava 和 Realm 构建本地数据源?