首页 > 解决方案 > 故障调用失败,尝试在空对象引用上调用接口方法“java.lang.reflect.Type retrofit2.CallAdapter.responseType()”

问题描述

我在执行返回简单 Call 对象的改造请求时遇到问题。

我的改造设置是这样完成的:

 new Retrofit.Builder()
                .addCallAdapterFactory(RxErrorHandlingCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson));

我有以下改造接口,其中混合了 rxjava 和定义的简单调用

MyInterface {
   Single getSingle1();
   Single getSingle2();
   Call getCall1();
}

我面临的问题是执行时: myInterface.getCall1().execute()我收到以下错误

Attempt to invoke interface method 'java.lang.reflect.Type retrofit2.CallAdapter.responseType()' on a null object reference

应该注意的是,如果我转换Call getCall1()为 returnCompletable getCall1()一切都按预期工作。

任何人都知道我做错了什么?

标签: androidretrofit2rx-java2

解决方案


我假设RxErrorHandlingCallAdapterFactory这篇文章中提到的课程。

的实现CallAdapterFactory应该返回null它不知道如何适应的类型。WrappedRxJava2CallAdapterFactory正确地做到了这一点,并为 Call 返回类型返回 null (通常由 built-in 处理DefaultCallAdapterFactory)。但是,RxErrorHandlingCallAdapterFactory会很高兴地忽略这一点并返回一个委托给 null 的适配器,从而在您实际尝试获取Call.

为了正确指示它无法处理的调用,您的 CallAdapterFactory 应该在包装工厂返回 null 时返回 null:

  public CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
      CallAdapter wrapped = original.get(returnType, annotations, retrofit);
      if (wrapped = null) {
          return null;
      }

      return new RxCallAdapterWrapper(retrofit, wrapped);
  }

推荐阅读