Retrofit RxJava 源码学习体会

Retrofit.

<T> T create(final Class<T> service) 方法:通过动态代理的方式生成了代理类。
 
  其中最重要:
Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
new InvocationHandler() {
private final Platform platform = Platform.get();

@Override public Object invoke(Object proxy, Method method, Object... args)
throws Throwable {
  ........
ServiceMethod serviceMethod = loadServiceMethod(method);【该类,Builder内部类解析,自己定义的接口类,包括参数、注解。最终传递给父类】
OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);【继承自Retrofit.Call ,内部方法均和Http3.Call一样,并且是指调用Http3.Call的方法
        return serviceMethod.callAdapter.adapt(okHttpCall);【callAdaper是RxJavaCallAdapterFactory.get()返回对应的CallAdapter,adapt方法返回Observable】
}
});

 okHttpCall,
    变量ServiceMethor,
    该变量通过Retorift.callFactory(
okhttp3.Call.Factory),返回okhttp3.Call.Factory(继承自OkHttpClient))
     OkHttpClient.newCall 返回RealCall
对象(继承【I】okhttp3.Call)
总结
okHttpCall,通过RealCall对象进行request(),cancle(),enqueue(),excute()



RxJavaCallAdapterFactory 三个内部类,均集成CallAdapter<T>
  ResponseCallAdatper,SimpleCallAdapter,ResultCallAdapter
RxJavaCallAdapterFactory.get()根据其参数返回上面三个任一
这三个类,扩展adapt(),均返回Observable,且这三的OnSubscribe【I】对象是CallOnSubscribe对象。
CallOnSubscribe 有继承自Retrofit.Call接口类变量引用。 ,也就是 OkHttpCall


__________________________________________

Observable:
subscribe(Subscriber<? super T> subscriber, Observable<T> observable) 干实事。
  该方法主要是:
   RxJavaHooks.onObservableStart(observable, observable.onSubscribe).call(subscriber);(主要是call()方法,下图的call)
RxJavaHooks.onObservableReturn(subscriber);(subscriber,是用户传入的)
 也就是oKHttpCall.call()-> RealCall.excute()

RequestArbiter类

图中 subscribe  ,正式外部Observable.subscribe(subscibe)传入的这个对象


 

Subscriber 类
 public void setProducer(Producer p) {
....
// we execute the request with whatever has been requested (or Long.MAX_VALUE)
if (toRequest == NOT_SET) {
producer.request(Long.MAX_VALUE);
} else {
producer.request(toRequest);
}
}
}
}
 
 



 


posted @ 2018-08-13 14:22  学海无涯++  阅读(183)  评论(0)    收藏  举报