【问题标题】:Retrofit / Dagger - Android : Fatal Exception: API declarations must be interfacesRetrofit / Dagger - Android:致命异常:API 声明必须是接口
【发布时间】:2020-05-22 03:00:12
【问题描述】:

我是 Retrofit 和 Dagger 的新手,我遇到了一个致命异常:API 声明必须是接口。在以下示例中被抛出:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_network);
    findViewById(R.id.test_network_button).setOnClickListener(this);
    progressBar = findViewById(R.id.progress_bar);
    viewModel = ViewModelProviders.of(this, providerFactory).get(NetworkViewModel.class);

ViewModelProviderFactory.java:

public class ViewModelProviderFactory implements ViewModelProvider.Factory {

private static final String TAG = "ViewModelProviderFactor";

private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators;


@Inject
public ViewModelProviderFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) {
    this.creators = creators;
}

@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
    Provider<? extends ViewModel> creator = creators.get(modelClass);
    if (creator == null) { 


        for (Map.Entry<Class<? extends ViewModel>, Provider<ViewModel>> entry : creators.entrySet()) {


            if (modelClass.isAssignableFrom(entry.getKey())) {
                creator = entry.getValue();
                break;
            }
        }
    }


    if (creator == null) {
        throw new IllegalArgumentException("unknown model class " + modelClass);
    }


    try {
        return (T) creator.get();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
}

NetworkModule.java:

@Module
public class NetworkModule {


@Singleton
@Provides
static StudioDataApi provideNetworkApi(Retrofit retrofit) {

    return retrofit.create(StudioDataApi.class);
}
}

完整的 Logcat 错误: https://pastebin.com/V0hqrEc6

附言

非常感谢任何建议/提示/想法!

【问题讨论】:

  • 虽然,我看不到你在哪里初始化 RetroFit 或它的回调,但请检查 this
  • 我认为错误可能在StudioDataApi,您能发布一下这个的定义吗?

标签: java android retrofit retrofit2 dagger-2


【解决方案1】:

问题一定是你的StudioDataApi不是接口。当您在改造中调用 create 时,它会验证您的 api。 Here 你可以看到对validateServiceInterface 的调用,这反过来又会抛出提到的异常here。如果您检查上面的if 语句,它正在检查您正在创建的api是否是一个接口。

为什么改造需要这样的东西?

内部改造使用Proxy Pattern 来创建您的服务。基本上,当您调用create 时,它会为您的服务/api 返回一个代理。这允许您以您想要的方式处理您的服务,并且当您调用服务方法时,它会确保为您调用 api。

仅此一项不足以引发上述异常,但是,retrofit 不会重新发明轮子,而是使用 java 的代理模式实现。当调用create 时,它实际上调用了Proxy.newProxyInstance,这要求你的服务是一个接口。

【讨论】:

    猜你喜欢
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2012-07-14
    相关资源
    最近更新 更多