Last active
March 8, 2022 03:44
-
-
Save flyer88/e7a1841185a3758acd7bc68c0d7a8cd8 to your computer and use it in GitHub Desktop.
如何实现 RxJava 的链式调用--异步中的异步 flatMap
This file contains 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 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 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(){...}; | |
} |
==================================================================
参考文章:
给 Android
开发者的 RxJava
详解 作者:扔物线
========================================================
========================================================
最后
记录一些 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
的一些概念有关联,不作解释。