1つは、RxJavaの紹介
Rxjavaは、多くのプロジェクトで使用されるサードパーティライブラリです。プロジェクトでは、Rxjava + retrofitがプロジェクト開発に役立つため、このサードパーティライブラリの原理を理解することで、多くの隠れた問題を解決できます。
2.プロセス分析
最終的にオブザーバーのチェーンが形成され、各オブザーバーオブジェクトには、スレッドを切り替える独自のスレッドスケジューラがあります。
OkHttpCallはokhttp3関連の操作をカプセル化します。
5つのステップでプロセスを分析します。
ステップ1:
retrofit.addCallApdapterFactory(RxJava2CallAdapterFactory.create())でRxJava2CallAdapterを設定し、レトロフィットで変数private final List <CallAdapter.Factory> adapterFactories = new ArrayList <>()にRxJava2CallAdapterFactoryを追加します。 ;
では、生成適応クラスRxJava2CallAdapter
が後で使用されます。このクラスは、adapte を呼び出し(call呼び出し)、observableのObservableオブジェクトを生成します。これは、典型的なブリッジモードです。
ステップ2:動的プロキシオブジェクトの動的プロキシオブジェクト
作成関数で、動的プロキシクラスはInvocationHandlerインターフェイスを実装する必要があります。プロキシオブジェクトを介してメソッドを呼び出すと、このメソッドの呼び出しはInvocationHandlerのインターフェイスに転送されますメソッドを呼び出して呼び出しを行います。InvocationHandlerインターフェースの唯一のメソッドinvokeメソッドを見てみましょう。つまり、後でservice.getSearchBook()が呼び出されると、このinvokeメソッドに移動します。
public <T> T create(final Class<T> service) {
Utils.validateServiceInterface(service);
if (validateEagerly) {
eagerlyValidateMethods(service);
}
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] {
service },
new InvocationHandler() {
private final Platform platform = Platform.get();
@Override public Object invoke(Object proxy, Method method, @Nullable Object[] args)
throws Throwable {
// If the method is a method from Object then defer to normal invocation.
if (method.getDeclaringClass() == Object.class) {
return method.invoke(this, args);
}
if (platform.isDefaultMethod(method)) {
return platform.invokeDefaultMethod(method, service, proxy, args);
}
ServiceMethod<Object, Object> serviceMethod =
(ServiceMethod<Object, Object>) loadServiceMethod(method);
OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);
}
});
}
ServiceMethod<?, ?> loadServiceMethod(Method method) {
ServiceMethod<?, ?> result = serviceMethodCache.get(method);
if (result != null) return result;
synchronized (serviceMethodCache) {
result = serviceMethodCache.get(method);
if (result == null) {
result = new ServiceMethod.Builder<>(this, method).build();
serviceMethodCache.put(method, result);
}
}
return result;
}
その中のSerivceMethod.callAdapter.adapt(okHttpCall)、生成プロセス:
ServiceMethod.Builder()。build()で、retroift.callAdatper()を呼び出してcallAdapterオブジェクトを生成します。
改造すると、callAdapterがnextCallAdapterを再度呼び出します。その中で、RxJava2CallAdapterFactoryオブジェクトがadapterFactories変数から取り出され、get()が呼び出されてRxJava2CallAdapterが生成されます。
最後に、serviceMethod.callAdapter.adapt(okHttpCall)がRxJava2CallAdapter.adapt関数に移動します。
RxJava2CallAdapter関数で:
@Override public <R> Object adapt(Call<R> call) {
Observable<Response<R>> responseObservable = new CallObservable<>(call);
Observable<?> observable;
if (isResult) {
observable = new ResultObservable<>(responseObservable);
} else if (isBody) {
observable = new BodyObservable<>(responseObservable);
} else {
observable = responseObservable;
}
if (scheduler != null) {
observable = observable.subscribeOn(scheduler);
}
if (isFlowable) {
return observable.toFlowable(BackpressureStrategy.LATEST);
}
if (isSingle) {
return observable.singleOrError();
}
if (isMaybe) {
return observable.singleElement();
}
if (isCompletable) {
return observable.ignoreElements();
}
return observable;
}
Observableが生成されますBodyObservable <>(responseObservable); where Observable <Response> responseObservable = new CallObservable <>(call);つまり、BodyObservableの上流の変数Observable <Response>なので、
2番目のステップで生成されたオブジェクト
は BodyObservableの3番目のステップです:ObservableSubscribeOn
observable.subscribeOn(Schedulers.io())を生成します
public final Observable<T> subscribeOn(Scheduler scheduler) {
ObjectHelper.requireNonNull(scheduler, "scheduler is null");
return RxJavaPlugins.onAssembly(new ObservableSubscribeOn<T>(this, scheduler));
}
BodyObservableおよびIoSchedulerをObservableSubscribeOnに配置します。ObservableSource
ソースはBodyObservableです
ステップ4:ObservableObserveOn
observeOn(AndroidSchedulers.mainThread())を生成する
public final Observable<T> observeOn(Scheduler scheduler, boolean delayError, int bufferSize) {
ObjectHelper.requireNonNull(scheduler, "scheduler is null");
ObjectHelper.verifyPositive(bufferSize, "bufferSize");
return RxJavaPlugins.onAssembly(new ObservableObserveOn<T>(this, scheduler, delayError, bufferSize));
}
ObservableSubscribeOnとHandlerScheduler
をオブザーバブルObservableObserveOnに配置します。ここで、ObservableSourceソースはObservableSubscribeOnオブジェクトであり、スレッド間の切り替えを実現する各スケジューラに対応するオブザーバブルの責任チェーンモードを形成し、割り込みなどを実現します。
ステップ5:オブザーバーを作成し、サブスクライバーを介して
監視対象のsubscribe(observer)に接続し
ます。このオブザーバーはオブザーバーであり、サブスクライブを介して各イベントの処理を開始します。