RxJava2+Retrofit2的Observable的执行探
2019-03-27 本文已影响0人
钰大人
关于Observable的调用流程探究,自解惑.
# gradle引用
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'io.reactivex.rxjava2:rxjava:2.2.7'
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.okhttp3:okhttp:3.14.0'
implementation 'com.squareup.okio:okio:2.2.2'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.14.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'
# 一般流程如下
mOkHttpClient = new OkHttpClient.Builder()
.addNetworkInterceptor(
new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
//在这里获取到request后就可以做任何事情了
Response response = chain.proceed(request);
Log.d(TAG, "intercept: url "+request.url().toString());
return response;
}
}
).build();
mRetrofit = new Retrofit.Builder()
.client(mOkHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(Constant.API_BASE_URL)
.build();
Single<> xx = mRetrofit.create(targetClass.class)
xx.scribeOn(io())
. ...
.subscribe();
# Json解析代码器 GsonConverterFactory.create()
# 转换为Observable及真正执行的地方 GsonConverterFactory.create()
Retrofit.create(targetClass.class)的时候会生成代理,其内部逻辑如下:
# 重点部分是serviceMethod的生成及adapt()的最终调用
new InvocationHandler() {
private final Platform platform = Platform.get();
@Override public Object invoke(Object proxy, Method method, 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生成的地方.
callAdapter生成位置是ServcieMethod.createCallAdapter(), 里面调用Retrofit.nextCallAdapter(),
最终根据注解及方法名获取对应的CallAdapter, adapterFactories.get(i).get(xxx):其实现为RxJava2CallAdapterFactory.java,函数返回值为new RxJava2CallAdapter(...);
其中的adapt(Call)返回的是目标Observable. (此处是:CallExecuteObservable)
Observable又在subscribe的时候调用subscribeActual, 最终调用observer.onNext/Complete/Error()