使用RxJava 2和Retrofit 2,适配器版本问题

时间:2016-12-14 10:25:57

标签: android retrofit2 rx-java2 gradle-dependencies

我已将新的库模块添加到Android Studio中的现有应用程序模块中。主要区别在于添加RxJava 2和Retrofit 2。 更新新模块的build.gradle后,我开始得到下一个错误:

  
    

错误:任务':app:transformResourcesWithMergeJavaResForBetaNewApiDebug'执行失败。         com.android.build.api.transform.TransformException:com.android.builder.packaging.DuplicateFileException:重复文件     复制到APK META-INF / rxjava.properties File1:     C:\ Users \用户Gaket.gradle \缓存\模块-2 \文件-2.1 \ io.reactivex.rxjava2 \ rxjava \ 2.0.2 \ cfccdd18cdfbe7b4773d42c9f3512eeafbe5cbf9 \ rxjava-2.0.2.jar       文件2:     C:\ Users \用户Gaket.gradle \缓存\模块-2 \文件-2.1 \ io.reactivex \ rxjava \ 1.1.5 \ ece7b5d0870e66d8226dab6dcf47a2b12afff061 \ rxjava-1.1.5.jar

  

我看到RxJava存在一些问题(我想尝试RxJava 2,在这里我看到RxJava 1和RxJava 2)。在添加所有依赖项后立即出现问题,我们在主应用程序中不使用RxJava

更新 正如我在下面提到的,我检查了三个主题(你可以在下面看到它)。此问题:possible duplicate类似于我在下面提到的问题:this one。他们两个都有解决方法,没有考虑我在答案中强调的真正问题。并且答案是"目前没有从Retrofit 2到RxJava 2的生产就绪适配器" (详情见下文答案)。

我检查了几个主题:first是针对具体问题的一些具体解决方案,second谈到rxbindings,但我没有使用它们,其他一些也没有解决了我的问题或看起来像完全解决方法this one。我试图google" rxjava 2并改造2"但是没有找到解决方案。

以下是库的build.gradle

apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'

android {
compileSdkVersion 25
buildToolsVersion "25.0.0"

defaultConfig {
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"

    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}



dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2',      {
    exclude group: 'com.android.support', module: 'support-annotations'
})

compile "com.android.support:appcompat-v7:$supportLibraryVersion"
compile "com.android.support:recyclerview-v7:$supportLibraryVersion"

compile 'io.reactivex.rxjava2:rxjava:2.0.2'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.okhttp3:okhttp:3.5.0'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile "com.makeramen:roundedimageview:1.3.0"

annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
provided 'javax.annotation:jsr250-api:1.0'
compile 'com.jakewharton:butterknife:8.4.0'

testCompile 'junit:junit:4.12'

}

问题是:
  为什么会出现这个问题以及处理它的正确方法是什么?

2 个答案:

答案 0 :(得分:20)

您应该将官方适配器用于第二个版本的RxJava:

compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0 // works with RxJava 2

适配器具有版本2.*.*的事实并不意味着它可以用于RxJava 2,正如我想的那样。

compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' // won't work with RxJava 2

以前,您应该使用临时版本:以下是Jake Wharton的Retrofit 2 to RxJava 2 adapter存储库。

我在Android Studio终端中使用命令gradlew :app dependencies发现了此问题,其中app是我的库模块的名称。在那里,我查找了“rxjava”关键字并找到了它的不同版本。

<强>更新 2月,21 Square发布了适配器的官方版本,正如 Darshan Mistry 在评论中指出的那样。答案已更新。

答案 1 :(得分:3)

如果使用不同的版本多次添加,则需要从项目中删除重复的库。

或者如果两个依赖且具有不同版本的库都将具有不同的meta inf版本,这将导致此类问题。

如何检查依赖关系/层次结构 参考this回答

在你的情况下,jar meta inf中有多个rxjava.properties 因此,要忽略该重复条目,请将其从build.gradle标记

中的应用程序android中排除
 packagingOptions {       
        exclude 'META-INF/rxjava.properties'
    }
相关问题