Retrofit2<三> rxJava 分析
rxJava體系比較大,為了收縮範圍還是從我實際開發用的著手。
private Observable request(Observable observable, int flag) {
if (flag == SINGLE) {
//Observable 對映
return observable
.map(this.functionSingle())
.compose(schedulersTransformer());
} else {
return observable
.map(this.functionList())
.compose(schedulersTransformer());
}
}
這裡對observable操作有兩種,一種是map,一種compose。
public final <R> Observable<R> map(Function<? super T, ? extends R> mapper) {
ObjectHelper.requireNonNull(mapper, "mapper is null");
return RxJavaPlugins.onAssembly(new ObservableMap<T, R>(this, mapper));
}
這個map方法傳入的引數是一個泛型類。Function,擁有兩個泛型引數一個是T,一個是R。這個T引數屬於Observable 構造物件攜帶的引數,大家要注意研究這個rxjava的時候,心中一定隨時關注這個Observable 物件,因為這個是RxJava的核心落腳點。看下Funtion 型別實際上是一個
public interface Function<T, R> {
/**
* Apply some calculation to the input value and return some other value.
* @param t the input value
* @return the output value
* @throws Exception on error
*/
R apply(@NonNull T t) throws Exception;
}
然後看下new ObservableMap<T, R>(this, mapper) 構造了一個ObservableMap。
有必要把整個ObservableMap 都貼出來。
public final class ObservableMap<T, U> extends AbstractObservableWithUpstream<T, U> {
final Function<? super T, ? extends U> function;
//構造方法傳入引數。
public ObservableMap(ObservableSource<T> source, Function<? super T, ? extends U> function) {
super(source);
this.function = function;
}
@Override
public void subscribeActual(Observer<? super U> t) {
//實際上是訂閱了一個觀察者。接下來關注這個觀察者的onNext方法,最終可以遇見肯定是要調到function的apply方法。其實RxJava本質就是傳入一堆物件,然後進行介面呼叫。
source.subscribe(new MapObserver<T, U>(t, function));
}
static final class MapObserver<T, U> extends BasicFuseableObserver<T, U> {
final Function<? super T, ? extends U> mapper;
MapObserver(Observer<? super U> actual, Function<? super T, ? extends U> mapper) {
super(actual);
this.mapper = mapper;
}
@Override
public void onNext(T t) {
if (done) {
return;
}
if (sourceMode != NONE) {
downstream.onNext(null);
return;
}
U v;
try {
//這個地方就是呼叫之前傳遞到的function的方法,其實這個也是對結果進行處理屬於增加觀察者的一種方式。
v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");
} catch (Throwable ex) {
fail(ex);
return;
}
downstream.onNext(v);
}
@Override
public int requestFusion(int mode) {
return transitiveBoundaryFusion(mode);
}
@Nullable
@Override
public U poll() throws Exception {
T t = qd.poll();
return t != null ? ObjectHelper.<U>requireNonNull(mapper.apply(t), "The mapper function returned a null value.") : null;
}
}
}
現在再來分析 observalbe.compose(schedulersTransformer()); composer方法傳入的是ObservableTransformer 。從名稱來看,屬於觀察源的轉換。這個介面實際上就只有一個apply方法。我們現在看下。我們的實際用法中,subscribeOn(Scheduler)和 observeOn(Scheduler scheduler)這兩個方法對於安卓來說是非常重要並且明顯的。
public final <R> Observable<R> compose(ObservableTransformer<? super T, ? extends R> composer) {
return wrap(((ObservableTransformer<T, R>) ObjectHelper.requireNonNull(composer, "composer is null")).apply(this));
}
首先呼叫的apply方法。我們看下
private ObservableTransformer schedulersTransformer() {
return new ObservableTransformer() {
@Override
public ObservableSource apply(Observable upstream) {
return upstream
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
};
}
現在把結論說明一下,subscribeOn 代表觀察源所跑的Scheduler,observeOn 代表觀察者也就是結果所在的執行緒,由於安卓都要求在主線中重新整理UI,所以這裡面直接用了跑在主執行緒的Scheduler。這兩個方法裡面的邏輯還是有點多。我們分開來講。
首先對subscribeOn 有個直觀解釋。我貼一個rx官網對這個api的介紹,相信都能看明白。
the SubscribeOn operator designates which thread the Observable will begin operating on。
指明Observable 應該被Schedulers.io()裡的thread 執行。observeOn 是指在指定shcedule的thread來接收這個事件。這兩個方法其實體現了rxjava的精髓,那就是可以做到執行緒切換,鏈式呼叫。事件產生
可以指定執行緒,並且可以對事件進行多次apply。傳遞到observe的時候也能做到執行緒指定,並且可以做到層層的攔截。
首先subscribeOn(Schedulers.io())
public final Observable<T> subscribeOn(Scheduler scheduler) {
ObjectHelper.requireNonNull(scheduler, "scheduler is null");
return RxJavaPlugins.onAssembly(new ObservableSubscribeOn<T>(this, scheduler));
}
public final class ObservableSubscribeOn<T> extends AbstractObservableWithUpstream<T, T> {
final Scheduler scheduler;
public ObservableSubscribeOn(ObservableSource<T> source, Scheduler scheduler) {
super(source);
this.scheduler = scheduler;
}
@Override
public void subscribeActual(final Observer<? super T> observer) {
//此處方法是構造了一個SubscribeOnObserver 的parent。
final SubscribeOnObserver<T> parent = new SubscribeOnObserver<T>(observer);
observer.onSubscribe(parent);
parent.setDisposable(scheduler.scheduleDirect(new SubscribeTask(parent)));
}
static final class SubscribeOnObserver<T> extends AtomicReference<Disposable> implements Observer<T>, Disposable {
private static final long serialVersionUID = 8094547886072529208L;
final Observer<? super T> downstream;
final AtomicReference<Disposable> upstream;
SubscribeOnObserver(Observer<? super T> downstream) {
this.downstream = downstream;
this.upstream = new AtomicReference<Disposable>();
}
@Override
public void onSubscribe(Disposable d) {
DisposableHelper.setOnce(this.upstream, d);
}
@Override
public void onNext(T t) {
downstream.onNext(t);
}
@Override
public void onError(Throwable t) {
downstream.onError(t);
}
@Override
public void onComplete() {
downstream.onComplete();
}
@Override
public void dispose() {
DisposableHelper.dispose(upstream);
DisposableHelper.dispose(this);
}
@Override
public boolean isDisposed() {
return DisposableHelper.isDisposed(get());
}
void setDisposable(Disposable d) {
DisposableHelper.setOnce(this, d);
}
}
final class SubscribeTask implements Runnable {
private final SubscribeOnObserver<T> parent;
SubscribeTask(SubscribeOnObserver<T> parent) {
this.parent = parent;
}
@Override
public void run() {
source.subscribe(parent);
}
}
}
現在要定位到Scheduler了,rxjava概念的另一個核心,(Obserable,Observe,Scheduler)。結合上面程式碼來分析下這個排程器。
IO = RxJavaPlugins.initIoScheduler(new IOTask());
這裡最終使用的是IoScheduler.
相關文章
- Android RxJava系列三: 與Retrofit2結合使用和封AndroidRxJava
- Rxjava2與Retrofit2的使用RxJava
- Retrofit2分析
- RxJava2 + Retrofit2 完全指南 之 對返回Response的統一處理RxJava
- RxJava小考題 -- Rxjava原始碼分析(一)RxJava原始碼
- 友好 RxJava2.x 原始碼解析(三)zip 原始碼分析RxJava原始碼
- 大話RxJava:三、RxJava的中級使用方法RxJava
- RxJava操作符系列三RxJava
- Android RxJava使用介紹(三) RxJava的操作符AndroidRxJava
- 10章 RxJava原始碼分析RxJava原始碼
- RxJava 執行緒模型分析RxJava執行緒模型
- RxJava2原始碼分析RxJava原始碼
- Rxjava2操作符(三)RxJava
- RxJava2原始碼分析(一):基本流程分析RxJava原始碼
- Android主流三方庫原始碼分析(五、深入理解RxJava原始碼)Android原始碼RxJava
- RxJava 沉思錄(三):時間維度RxJava
- Retrofit2原始碼解析原始碼
- 給初學者的RxJava2.0教程(三)RxJava
- RxJava2原始碼分析(二):操作符原理分析RxJava原始碼
- Retrofit2原始碼解析(一)原始碼
- RxJava2.x 從原始碼分析原理RxJava原始碼
- RxJava操作符之建立操作符(三)RxJava
- 秒懂Retrofit2之GsonConverter
- 深入淺出RxJava(三)--響應式的好處RxJava
- Rxjava 2.x 原始碼系列 - 基礎框架分析RxJava原始碼框架
- 基於Retrofit2實現的LycheeHttpHTTP
- Retrofit2之CallAdapter和ConverterAPT
- Retrofit2使用方式和原始碼解析原始碼
- RXJAVARxJava
- RxJava 原始碼分析系列(四) -操作符變換原理RxJava原始碼
- Rxjava原始碼思路分析與程式設計師的思考RxJava原始碼程式設計師
- 【原始碼SOLO】Retrofit2原始碼解析(一)原始碼
- 【原始碼SOLO】Retrofit2原始碼解析(二)原始碼
- Retrofit2的再封裝實戰—多執行緒下載與斷點續傳(三)封裝執行緒斷點
- RxJava2系列實踐之倒數計時功能(三)RxJava
- RxJava梳理RxJava
- Retrofit + RxJavaRxJava
- RxJava ,lift()RxJava