我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情
在使用RxJava开发的时候有时会遇到类似Cannot resolve method 'subscribe(anonymous io.reactivex.Observer)'的错误提示。
咋一看subscribe订阅代码并没有什么问题,但是编辑器一直提示错误。
解决方案
其实这是我们在create的时候使用了lambda表达式的缘故。
使用lambda并没有什么问题,问题在于使用lambda表达式的时候,subscribe订阅代码我们可能并没有写,这时使用lambda后代码就变成这样:
emitter -> {
try {
Thread.sleep(2000); // 假设此处是耗时操作
} catch (Exception e) {
e.printStackTrace();
emitter.onError(new RuntimeException());
}
emitter.onNext(true);
}
而在我们写完了subscribe代码后,再使用lambda转换,代码就变成:
(ObservableOnSubscribe<Boolean>) emitter -> {
try {
Thread.sleep(2000); // 假设此处是耗时操作
} catch (Exception e) {
e.printStackTrace();
emitter.onError(new RuntimeException());
}
emitter.onNext(true);
}
可以看到多了一个ObservableOnSubscribe,这是对T类型的确定。
所以一般我们使用RxJava时,如果要使用lambda表达式,需要在subscribe订阅内容完成后再进行统一转换。转换一般我们使用编辑器帮我们自动转换,windows中快捷键是alt + enter: