【问题标题】:RxJavaCallAdapterFactory cannot be converted to FactoryRxJavaCallAdapterFactory 无法转换为工厂
【发布时间】:2016-10-10 05:20:41
【问题描述】:

我正在尝试按照本指南中的指南使用 Retrofit 2 和 RxJava https://inthecheesefactory.com/blog/retrofit-2.0/en

在“RxJava 与 CallAdapter 集成”部分中 " 解释了如何使用 RxJava 进行改造

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("http://api.nuuneoi.com/base/")
    .addConverterFactory(GsonConverterFactory.create())
    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
    .build();

但是在编译过程中出现如下错误:

Error:(63, 71) error: incompatible types: RxJavaCallAdapterFactory cannot be converted to Factory

我该如何解决? 谢谢

【问题讨论】:

  • 您是否包括了提到的依赖项?编译 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2' 编译 'io.reactivex:rxandroid:1.0.1'
  • 是的,我包括依赖项 compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2' compile 'io.reactivex:rxandroid:1.0.1'
  • @LuisaRepele 很奇怪,但我已经包含了所有必要的依赖项,Android Studio 仍然找不到RxJavaCallAdapterFactory。然后我手动添加import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; 并且它起作用了。

标签: android rest retrofit rx-java retrofit2


【解决方案1】:

确保您对主要的 Retrofit 依赖、Gson 转换器依赖和 RxJava 适配器依赖使用相同的 groupId 和版本。

我猜你的看起来像这样:

compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2'

(注意它们使用不同的 groupId 和版本号)

它们应该看起来都一样:

compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'

【讨论】:

  • 感谢您对版本代码的关注,因为我使用的是 2.3.0,但后来意识到转换器-gson 是 2.1.0,这就是为什么我收到无法解析 RxJavaCallAdapterFactory 的错误。但是,如果我查看 gradle 文件,就会发现所有库集。
  • 我正在使用 com.squareup.retrofit:retrofit:2.0.0-beta2,目前无法更新此库。在这种情况下我该怎么办?
【解决方案2】:

当前添加“com.squareup.retrofit:adapter-rxjava:2.0.0”会出现以下错误

Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'. > com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/rxjava.properties

但是,相反,添加“compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0”,使打包成功

【讨论】:

  • 截至 2017 年 3 月 9 日仍然如此。我正在使用改造 2.2.0、jakewharton 的 rxjava2-adapter 1.0.0、rxandroid 2.0.1 和 rxjava 2.0.7。
  • 其实应该导入compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0',然后使用.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
【解决方案3】:

将您的改造 rxjava 适配器更改为

  implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofit_version"

并将您的 CallAdapterFactory 更改为

.addCallAdapterFactory(RxJava2CallAdapterFactory.create())

它看起来像这样

.baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

【讨论】:

    【解决方案4】:

    使用更新和最新的库。

    // retrofit
        implementation 'com.squareup.retrofit2:retrofit:2.9.0'
        implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
        implementation 'com.squareup.okhttp3:okhttp:4.9.0'
        implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
        implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'
    
        // rxjava3
        implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
        implementation 'io.reactivex.rxjava3:rxjava:3.0.0'
    

    注意 :: RxJava3CallAdapterFactory.create() 而不是 RxJava2CallAdapterFactory.create()

    Retrofit.Builder()
                .baseUrl("https://datanapps.com")
                .client(okHttpClient)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
                .build()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-30
      • 2018-05-24
      • 1970-01-01
      • 2016-01-12
      • 2019-12-11
      • 1970-01-01
      • 2014-04-22
      • 2020-12-31
      相关资源
      最近更新 更多