一、Failed to resolve: io.reactivex:rxjava:2.0.1
原因:2.0的导入名称改了:io.reactivex.rxjava2:rxjava:2.0.1,自己有点想当然了
二、cannot access rx....或其他如cannot access okhttp3...
原因:依赖module中用compile或api,改为implement,或者将代码直接移到app模块中
三、代码各种错,即使按照2.0的来改了还是一直报错
原因:很可能项目当中有别的第三方库仍在依赖rxjava1.0版本,导致1.0和2.0的jar包同时存在,造成类使用错误,记得1.0对应的包名是rx开头,2.0对应的是io.reactivex开头
四、有1.0和2.0的rxjava的jar包同时存在(这也是第三个问题的另一个问题)
* What went wrong:
Execution failed for task ':CorMobiApp:CorMobiEngineProject:transformResourcesWithMergeJavaResForRelease'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/rxjava.properties
File1: /Users/dev/.gradle/caches/modules-2/files-2.1/io.reactivex.rxjava2/rxjava/2.0.1/57f850a6b317e5582f1dbaff10a9e7d7e1fcdcfb/rxjava-2.0.1.jar
File2: /Users/dev/.gradle/caches/modules-2/files-2.1/io.reactivex/rxjava/1.1.5/ece7b5d0870e66d8226dab6dcf47a2b12afff061/rxjava-1.1.5.jar
解决过程:明明已经把compile 'io.reactivex:rxjava:1.1.5'这个注释掉了,怎么还有这个版本的jar包存在,看来是其他第三方框架引用了这个版本的RxJava了,怎么看项目当中jar包的各种互相依赖关系呢?最简单的办法,androidstudio右侧gradle找到这个task执行:
稍等就能在控制台看到了
这里可以看到,843行导入了rxjava2.0.1,845行导入rxandroid引用的也是这个rxjava2.0.1,但是在853行导入retrofit2:adapter引用的却是rxjava1.1.5,所以这里也要升级:
compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
同时,如果代码里面有RxJavaCallAdapterFactory这个类,要改为RxJava2CallAdapterFactory。
最后,附上最常用写法的变动:
rxjava1.0:
Observable.create(new Observable.OnSubscribe<Boolean>() {
@Override
public void call(Subscriber<? super Boolean> subscriber) {
boolean b = false;
subscriber.onNext(b);
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Boolean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Boolean s) {
}
});
rxjava2.0:
Observable.create(new ObservableOnSubscribe<Boolean>() {
@Override
public void subscribe(ObservableEmitter<Boolean> subscriber) {
boolean b = false;
subscriber.onNext(b);
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Boolean>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onComplete() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Boolean s) {
}
});
特别要注意Observable和Schedulers包名的变化