上次分析了Retrofit的配置代碼流程,這次分析下它的的create流程
首先分析restAdapter,它是一個Retrofit對象,以上代碼調用了它的create方法,下面是create中的相關代碼:
現在逐行分析以上代碼,首先分析validateServiceInterface方法,以下是相關代碼:
這段代碼告訴我們傳遞的參數必須是一個接口并且這個接口不可以有繼承關系,否則會主動拋出一個異常,接著是eagerlyValidateMethods方法,這個方法的調用必須要validateEagerly為true,從配置篇中我們知道這個參數的默認值是false,所以在當前配置的操作中他是不會進入的,那么看下這個方法在true的時候會做的事情,以下是eagerlyValidateMethods方法的相關代碼:
在以上的代碼中兩段代碼中,首先獲取了當前的平臺,我們當前是android平臺,那么相當于返回了一個Android platform = new Android()的對象,接著判斷service接口申明的方法是否是Platform的默認方法,如果不是則走loadMethodHandler(method)方法
以上代碼中首先在緩存列表methodHandlerCache中通過method去獲取handler,當獲取不到的時候創建一個新的handler,并且存入緩存列表methodHandlerCache中,到此位置eagerlyValidateMethods方法分析完畢,可以看到如果validateEagerly參數如果我們在配置的時候設置為true的時候,程序是在做一個預處理的操作,只是提前創建了一些MethodHandler對象在緩存中。
現在來分析下MethodHandler.create()方法做的事情,它需要兩個參數一個是Retrofit對象,一個是當前的Method,代碼如下:
以上代碼中,先看最后返回的MethodHandler用到的對象,分別是Retrofit、CallAdapter、Converter、RequestFactory,首先分析CallAdpter的創建,代碼如下:
以上代碼中首先或者了Method的返回類型,然后對類型進行了校驗,接著獲取Method的所有注釋,然后調用了Retorfit對象的callAdapter方法,傳遞的參數是當前方法的返回類型和注釋數組,callAdapter方法如下:
以上代碼從indexOf這段開始看,這段是比較核心的,在配置篇中adapterFactories是被初始化過了,而且里面是有值的,包含RxJavaCallAdapterFactory,DefaultCallAdapter兩個CallAdapter,那么現在indexOf方法中傳遞的參數從以上代碼可以分析出來是null,那么返回值就是-1,start的值就是0,那么adapterFactories.get(0)返回的就是RxJavaCallAdapterFactory對象,這個時候再調用RxJavaCallAdapterFactory對象的get方法,代碼如下:
以上代碼主要看getCallAdapter方法,這里主要有三種方式會返回CallAdapter,第一種是Observable<Response>,第二種是Observable<Result>,其他對象(Observable<其他認識object>)都返回SimpleCallAdapter,現在看下初始化SimpleCallAdapt,它需要一個被觀察者(Observable)的參數,下面是SimpleCallAdapter的代碼:
具體實現方法的作用現在不做解釋,現在整個CallAdapter的create流程完畢了,也就是MethodHandler.create()方法中的CallAdapter有值了,是一個SimpleCallAdapter,在獲取SimpleCallAdapter的過程中核心是通過接口方法獲取了具體的返回類型。
接著看MethodHandler.create()方法中的第二行,因為我們在上面SimpleCallAdapter已經獲取了response的類型,那么就可以獲取到,這段代碼不做解釋,接著看createResponseConverter方法,這個方法返回Converter<ResponseBody, Object> responseConverter,代碼如下:
以上代碼調用Retorfit中的responseConverter方法,傳遞的參數是當前Method的返回類型及注釋數組,代碼如下:
以上代碼中可以看到converterFactories.get(i)方法,這個方法獲取是我們在配置篇中初始化的GsonConverterFactory對象,調用了這個對象中的formResponseBody方法,傳遞參數是當前Method的返回類型及注釋數組,代碼如下:
在以上代碼中new了一個GsonResponseBodyConverter對象,傳遞了在配置篇中初始化的Gson對象及本篇中CallAdpater中獲取的具體返回類型,目前位置GsonResponseBodyConverter的初始化工作也完畢了。
本篇分析比較長,在這里注釋下GsonResponseBodyConverter具備的能力
1、已經具備了解析json數據的能力
2、已經知道了json解析后需要轉換成什么類型(Observable<我們的對象類型>)
接著分析MethodHandler.create()中最后一個對象RequestFactory的獲取,代碼如下:
先來分析parseMethodAnnotations方法,代碼如下
以上代碼中遍歷了當前Method的注釋數組,并進行了解析,接著是解析傳遞的參數,代碼如下:
這段代碼比較長,留著后面單獨分析,到目前位置已經解析了注釋和參數類型,這個時候拿到了RequestFactory對象,代碼如下:
創建的流程完畢,在這個流程中,獲取了三個對象CallAdapter后續介紹,Converter數據轉換對象,RequestFactory數據解析對象。