RxJava中Func0与Action1的适用场景及区别
RxJava中Func0与Action1的区别及适用场景
嘿,我来帮你拆解清楚这两个接口的区别和适用场景,结合你给出的代码片段会更直观~
核心区别
Func0和Action1最本质的差异在于是否有返回值以及异常处理的定位:
- Func0:属于
Func系列接口,它的call()方法必须返回一个结果,而且允许抛出受检异常(比如你代码里的IOException)。RxJava会自动捕获这些异常,并转换成Observable的onError事件传递下去。 - Action1:属于
Action系列接口,它的call()方法接收一个输入参数,但没有返回值,主要用于执行“副作用”操作(比如UI更新、日志打印)。它不允许抛出受检异常,需要你自己在方法内部catch处理。
另外补充下:Func和Action都有不同参数版本的接口,比如Func1(接收1个参数+返回结果)、Action0(无参数无返回),你用到的Func0是无输入、有返回,Action1是1个输入、无返回。
适用场景
什么时候用Func0?
- 当你需要生成、提供数据或者Observable的时候:比如
Observable.defer()、Observable.fromCallable()这类操作符,要求每次订阅时动态创建数据源/Observable,这时候就需要用Func0(或Callable)来返回这个结果。 - 适合有返回值且可能抛出异常的场景:比如数据库读取、网络请求这类可能出错的操作,用Func0可以直接抛出异常,交给RxJava统一处理错误流。
什么时候用Action1?
- 当你需要消费数据、执行副作用的时候:比如
subscribe()的onNext回调、doOnNext()、doOnComplete()这类操作符,只需要处理接收到的数据,不需要返回任何结果,就用Action1。 - 适合UI更新、日志记录、数据持久化这类只做动作不产出结果的场景。
结合你的代码分析
先贴一下格式化后的代码:
Observable.defer(new Func0<Observable<String>>() { @Override public Observable<String> call() { try { return Observable.just(Database.readValue()); } catch(IOException e) { return Observable.error(e); } } }) .subscribe(new Action1<String>() { @Override public void call(String result) { resultTextView.setText(result); } });
defer()里用Func0非常合适:因为defer()的作用就是每次订阅时重新创建Observable,你的Func0里完成了数据库读取操作,成功就返回包含数据的Observable,失败就返回error事件,完美契合Func0“提供返回值+处理异常”的定位。subscribe()里用Action1也很准确:这里只需要把订阅到的字符串设置到TextView上,是典型的“消费数据、执行UI副作用”场景,不需要返回任何结果,用Action1正好。
内容的提问来源于stack exchange,提问作者ant2009
相关产品推荐
相关产品推荐

