gpt4 book ai didi

java - retrofit / Dagger - Android : Fatal Exception: API declarations must be interfaces

转载 作者:行者123 更新时间:2023-12-01 16:35:56 25 4
gpt4 key购买 nike

我对 Retrofit 和 Dagger 非常陌生,我收到一个致命异常,指出:API 声明必须是接口(interface)。 在以下示例中抛出:

    @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

附注

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

最佳答案

问题一定是您的 StudioDataApi 不是一个接口(interface)。当您在 Retrofit 中调用 create 时,它会验证您的 api。 Here您可以看到对 validateServiceInterface 的调用,该调用又会抛出上述异常 here 。如果您检查上面的 if 语句,它会检查您正在创建的 api 是否是一个接口(interface)。

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

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

仅此还不足以引发上述异常,但是,Retrofit 并没有重新发明轮子,而是使用了 Java 的代理模式实现。当调用 create 时,它实际上调用 Proxy.newProxyInstance这要求您的服务是一个接口(interface)。

关于java - retrofit / Dagger - Android : Fatal Exception: API declarations must be interfaces,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61947137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com