Ошибка вызова с попыткой вызвать интерфейсный метод 'java .lang.reflect.Type retrofit2.CallAdapter.responseType ()' для пустой ссылки на объект - PullRequest
0 голосов
/ 06 января 2020

У меня проблемы с выполнением запроса на модификацию, который возвращает простой объект Call.

У меня настроена модификация следующим образом:

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

И у меня есть следующий интерфейс для модификации в котором смешаны rx java и определены простые вызовы

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() в возвращаемое Completable getCall1(), все будет работать, как и ожидалось.

Кто-нибудь знает, что я делаю неправильно?

1 Ответ

0 голосов
/ 06 января 2020

Я предполагаю, RxErrorHandlingCallAdapterFactory - это класс, упомянутый в этом посте .

Реализации CallAdapterFactory должны возвращать null для типа, который не знает, как адаптироваться. Обернутый RxJava2CallAdapterFactory делает это правильно и возвращает null для типов возврата Call (которые обычно обрабатываются встроенным DefaultCallAdapterFactory). Тем не менее, RxErrorHandlingCallAdapterFactory с радостью проигнорирует это и вернет адаптер, который делегирует значение null, вызывая cra sh, когда вы на самом деле пытаетесь получить Call.

Для правильного указания вызовов, которые он не может обработать ваш CallAdapterFactory должен возвращать ноль всякий раз, когда упакованная фабрика возвращает ноль:

  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);
  }
...