使用Dagger + Retrofit + RxJava创建适配器错误

时间:2017-02-23 03:05:55

标签: android retrofit rx-java observable dagger

我正在尝试使用Retrofit获取Observable。我收到了这个错误:

  

无法为方法AqicnApi.getHerePollutionObservable创建rx.Observable的调用适配器

这是我在MainActivity中收到错误的地方:

Observable<Aqicn> aqicnObservable = aqicnApi.getHerePollutionObservable(getResources().getString(R.string.aqicn_token));

这是我的AqicnApi界面:

public interface AqicnApi {
    @GET("feed/here/")
    Call<Aqicn> getHerePollution(@Query("token") String token); // Query token parameter needed for API auth

    @GET("feed/here/")
    Observable<Aqicn> getHerePollutionObservable(@Query("token") String token); // Query token parameter needed for API auth
}

如果我尝试使用此功能让我的数据返回Aqicn而不是Observable<Aqicn>,则效果非常好:

Call<Aqicn> call = aqicnApi.getHerePollution(getResources().getString(R.string.aqicn_token));

这是我的ApiModule类,带有Retrofit提供程序

@Module
public class ApiModule {
    private String baseUrl;

    public ApiModule(String baseUrl) {
        if(baseUrl.trim() == "") {
            throw new IllegalArgumentException("API URL not valid");
        }
        this.baseUrl = baseUrl;
    }

    // Logging
    @Provides
    public OkHttpClient provideClient() {
        ...
    }

    //Retrofit
    @Provides
    public Retrofit provideRetrofit(String baseURL, OkHttpClient client) {
        return new Retrofit.Builder()
                .baseUrl(baseURL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }

    /**
     * Gets an instance of our Retrofit object calling the above methods then, using this Retrofit
     * object it creates an instance of AqicnApi interface by calling the create() method.
     * @return
     */
    @Provides
    public AqicnApi provideApiService() {
        return provideRetrofit(baseUrl, provideClient()).create(AqicnApi.class);
    }
}

我忘记了什么?

1 个答案:

答案 0 :(得分:1)

Rx中的Retrofit支持是您必须添加的插件,默认情况下不存在。

将此库添加到build.gradle

中的项目中
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'

并将Rx适配器工厂提供给Retrofit构建器:

@Provides
public Retrofit provideRetrofit(String baseURL, OkHttpClient client) {
    return new Retrofit.Builder()
            .baseUrl(baseURL)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            //You must provide Rx adapter factory to Retrofit
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();
}