Last active
March 8, 2022 03:44
-
-
Save flyer88/e7a1841185a3758acd7bc68c0d7a8cd8 to your computer and use it in GitHub Desktop.
如何实现 RxJava 的链式调用--异步中的异步 flatMap
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| public interface Api{ | |
| void queryPhoto(String query,QueryCallback QueryCallback); | |
| void store(Photo photo,StoreCallback storeCallback); | |
| interface QueryCallback{ | |
| void onQuerySuccess(List<Photo> photoList); | |
| void onQueryFailed(Exception e); | |
| } | |
| interface StoreCallback{ | |
| void onCatStored(Uri uri); | |
| void onStoredFailed(Exception e); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| RxJob<List<Photo>> queryPhotoJob = new RxJob<List<Photo>>(){ | |
| @Override | |
| public void doJob(final RxCallback<List<Photo>> rxCallback) { | |
| mApi.queryPhoto("flyer", new Api.QueryCallback() { | |
| @Override | |
| public void onQuerySuccess(List<Photo> photoList) { | |
| rxCallback.onNext(photoList); | |
| } | |
| @Override | |
| public void onQueryFailed(Exception e) { | |
| rxCallback.onError(e); | |
| } | |
| }); | |
| } | |
| }; | |
| }; | |
| RxJob<List<Photo>> storePhotoJob = new RxJob<Uri>() { | |
| @Override | |
| public void doJob(RxCallback<Uri> rxCallback) { | |
| mApi.store(photo, new Api.StoreCallback() { | |
| @Override | |
| public void onCatStored(Uri uri) { | |
| rxCallback.onNext(uri); | |
| } | |
| @Override | |
| public void onStoredFailed(Exception e) { | |
| rxCallback.onError(e); | |
| } | |
| }); | |
| } | |
| }; | |
| queryPhotoJob.map(photoList -> { return getBestPhoto(photoList);}) | |
| .flatMap(photo -> { return storePhotoJob;} ) | |
| .map(photo -> {return photo.getUrl();}) | |
| .doJob(new RxCallback<String>() { | |
| @Override | |
| public void onNext(String s) { | |
| ToastUtils.show(s); | |
| } | |
| @Override | |
| public void onError(Exception e) { | |
| ToastUtils.show(e); | |
| } | |
| }); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| public abstract class RxJob<T>{ | |
| public abstract void doJob(RxCallback<T> rxCallback){} | |
| public RxJob map(){ | |
| final RxJob<T> curJob = this; | |
| return new RxJob<R>() { | |
| @Override | |
| public void doJob(final RxCallback<R> rxCallback) { | |
| curJob.doJob(new RxCallback<T>() { | |
| @Override | |
| public void onNext(T t) { | |
| R mapped = func.call(t); | |
| rxCallback.onNext(mapped); | |
| } | |
| @Override | |
| public void onError(Exception e) { | |
| rxCallback.onError(e); | |
| } | |
| }); | |
| } | |
| }; | |
| } | |
| public RxJob flatMap(){...}; | |
| } |
Author
Author
==================================================================
参考文章:
给 Android 开发者的 RxJava 详解 作者:扔物线
========================================================
Author
========================================================
最后
记录一些 RxJava 相关的文章内容
RxJava 中的 contactMap 和 flatMap 区别
========================================================
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
解释为什么
map函数无法实现flatMap的功能?flatMap中的转变函数的具体实现是T -> RxJob<R>的转换带入当前例子就是
Photo —> RxJob<String>注意,之前的
map方法是List —> Photo而不是List<Photo> -> Photo因为
map方法的入参是Func<T,R> func,而不是Func<List<T>,R> func而
flaMap函数的入参则是Func<T,RxJob<R>> func,写死了第二个参数类型必须是RxJob<R>,然后RxJob<R>方法会被执行做到了异步中的异步,同样也说明了入参
Func<?,?> func会决定转换函数的功能,从而影响整个变换的不同map和flatMap的区别就如下图
其核心在于类型的变换,即
Func<?,?> func也就是函数式编程中的Functor不同的
func就会实现不同的变换,flatMap就是一个Monad当其运用到 ReactiveX 上时,其转换核心就是数据流,也就做到了
Observe/Subscribe的模式,因为在每一次变换后数据始终存在,对应的操作也可触发。不过RxJava还有更多其他的东西,不仅仅是这两个变换。但基本上理解这两个变换就能举一反三了,理解其他变换RxJava中的map/flatMap也是创建对于的Observable对象,然后调用对应的函数,然后返回需要的数据其中
map方法中的入参Function,只会在各种类型中转换而
flatMap中的入参Function必然会转换出一个Observable<R>类型在
RxJava 2转换出的是一个ObservableSource<R>官方解释如下,non-backpressured Observable,可以理解为类似
Observable类型,此处和backpressured的一些概念有关联,不作解释。