android - 故障调用失败,尝试在空对象引用上调用接口方法“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()
一切都按预期工作。
任何人都知道我做错了什么?
解决方案
我假设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);
}