Retrofit / Dagger-Android:致命异常:API声明必须为接口

问题描述 投票:0回答:1

我对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

P.S。

非常感谢任何建议/技巧/想法!

java android retrofit retrofit2 dagger-2
1个回答
0
投票

问题必须是您的StudioDataApi不是接口。在改造中调用create时,它将验证您的api。在Here中,您会看到对validateServiceInterface的调用,该调用将依次通过上述异常here。如果您检查上面的if语句,它将检查您正在创建的api是否是接口。

为什么要进行改装?

内部翻新使用Proxy Pattern创建您的服务。基本上,当您调用create时,它将返回服务/ api的代理。这样一来,您可以在调用服务方法时以自己想要的方式和在后台处理服务,这将确保为您调用api。

仅仅这还不足以引发所提到的异常,但是,改造并不能彻底改变轮子,而是使用Java的代理模式实现。当调用create时,它实际上会调用Proxy.newProxyInstance,这需要您的服务作为接口。

© www.soinside.com 2019 - 2024. All rights reserved.