retrofit 源码分析
callAdater可以設(shè)置RxJava2CallAdapter,目前只可用這個(gè)adapter,支持rxjava2的操作;convertAdater可以使用多種進(jìn)行操作。
調(diào)用例子:
Retrofit retrofit = builder.baseUrl("https://api.github.com").client(client).build();
return retrofit.create(serviceClass); 通過創(chuàng)建Retrofit分析得到,數(shù)據(jù)的內(nèi)容為public <T> T create(final Class<T> service) {};傳入的參數(shù)是一個(gè)類型Class的類型,返回的也是這個(gè)class實(shí)例對(duì)象,這里返回的
是serviceClass類對(duì)象。這個(gè)對(duì)象未進(jìn)行初始化操作,就是里面的接口的函數(shù)實(shí)例未進(jìn)行初始化。會(huì)使用動(dòng)態(tài)代理創(chuàng)建一個(gè)newProxyInstance對(duì)象,通過傳入的InvocationHandler類進(jìn)行操作。
retrofit 創(chuàng)建類變量,創(chuàng)建時(shí)需要下面的變量進(jìn)行初始化,callFactory通過client的方法進(jìn)行設(shè)置;baseurl就是鏈接的網(wǎng)址;converterFactories轉(zhuǎn)換發(fā)送和接收的json報(bào)文信息,或者組包
請(qǐng)求的數(shù)據(jù)包。adapterFactories執(zhí)行rxjava的RxJava2CallAdapterFactory、callbackExecutor平臺(tái)創(chuàng)建的執(zhí)行回掉,普通的java平臺(tái)和安卓平臺(tái);
?reponse 返回的convert匹配方法,通過判斷
通過日志可以監(jiān)控到,retrofit默認(rèn)的有一個(gè)BuiltInConverters
?
public abstract io.reactivex.Single com.seuic.getuser.EventService.getFollowing(long)傳入的method是一個(gè)抽象的方法,返回的結(jié)果是servicemethod的對(duì)象,在創(chuàng)建servicemethod的時(shí)候,會(huì)初始化所有參數(shù),各種adapter,具體的詳細(xì)field如下圖所示:
ServiceMethod(Builder<R, T> builder) {this.callFactory = builder.retrofit.callFactory();this.callAdapter = builder.callAdapter;this.baseUrl = builder.retrofit.baseUrl();this.responseConverter = builder.responseConverter;this.httpMethod = builder.httpMethod;this.relativeUrl = builder.relativeUrl;this.headers = builder.headers;this.contentType = builder.contentType;this.hasBody = builder.hasBody;this.isFormEncoded = builder.isFormEncoded;this.isMultipart = builder.isMultipart;this.parameterHandlers = builder.parameterHandlers;}
servicemethod類提供了創(chuàng)建okhttp的請(qǐng)求組包,在okhttpcall中被調(diào)用,toRequest函數(shù)返回一個(gè)請(qǐng)求的 對(duì)象;
CallExecuteObservable》OkHttpCall》servicemethod里的okhttp的client和request
private okhttp3.Call createRawCall() throws IOException {Request request = serviceMethod.toRequest(args);okhttp3.Call call = serviceMethod.callFactory.newCall(request);if (call == null) {throw new NullPointerException("Call.Factory returned null.");}return call;}
okhttp的call是在rxjava2 calladpter運(yùn)行的。執(zhí)行的結(jié)果如下圖所示
?
?retrofit http請(qǐng)求返回類型說明,返回類型通過類型解析獲取到,最終返回的類型為Page<user>的類
public interface EventService {@GET("users/{username}/received_events")Single<Response<Page<User>>> getUserRecievedEvents(@Path("username") String username, @Query("page") long page);@GET("/user/following")Single<Response<Page<User>>> getFollowing(@Query("page") long page); }
關(guān)于convertadpater匹配說明,實(shí)際的使用中,可以設(shè)置多個(gè)convertadpater,但是最終的選擇是根據(jù)返回的類型進(jìn)行解析選定的,就是
int start = converterFactories.indexOf(skipPast) + 1;for (int i = start, count = converterFactories.size(); i < count; i++) {Converter<ResponseBody, ?> converter = converterFactories.get(i).responseBodyConverter(type, annotations, this);if (converter != null) {//noinspection uncheckedreturn (Converter<ResponseBody, T>) converter;}}
type:當(dāng)前請(qǐng)求返回的類型,本例中就是page,通過代碼跟蹤可以看到,循環(huán)的匹配查找當(dāng)前的adpater里類型與type是否一致,不一致就返回null,繼續(xù)尋找下一個(gè),直接遇到moshi這個(gè)對(duì)象,直接把type傳入進(jìn)去,創(chuàng)建一個(gè)轉(zhuǎn)換的adatper,可以將json轉(zhuǎn)換成指定的class 對(duì)象,所以這里可以添加多個(gè)convertadatper,可以在需要用的時(shí)候直接調(diào)用;如果不添加,會(huì)默認(rèn)一個(gè)convert,用戶可以寫自己的convert,然后添加進(jìn)去。
當(dāng)且僅當(dāng)調(diào)用everntservice里面的函數(shù)的時(shí)候,才會(huì)運(yùn)行調(diào)用InvocationHandler里面的invoke函數(shù),在創(chuàng)建retrofit接口實(shí)例的時(shí)候不會(huì)調(diào)用invoke回掉
1、retrofit模塊對(duì)象說明,主要提供設(shè)置請(qǐng)求地址設(shè)置,創(chuàng)建callAdapter和convertAdpter對(duì)象的實(shí)例化。以及create實(shí)現(xiàn)的動(dòng)態(tài)代理調(diào)用,create是調(diào)用的核心代碼,實(shí)現(xiàn)一個(gè)接口的實(shí)例。
?
2、ServiceMethod對(duì)象提供請(qǐng)求和解析的功能,給okhttp的回掉使用;生成http請(qǐng)求的body,同時(shí)解析返回的body數(shù)據(jù);在build的時(shí)候解析http數(shù)據(jù)包的各個(gè)字段,例如
head和body等信息,創(chuàng)建http請(qǐng)求時(shí)需要該字段。 ?
?OkHttpCall類繼承了call接口,該對(duì)象主要是okhttp請(qǐng)求操作,對(duì)call接口的實(shí)現(xiàn),該接口提供給rxjavaAdapter使用
?
轉(zhuǎn)載于:https://www.cnblogs.com/istar/p/7737139.html
總結(jié)
以上是生活随笔為你收集整理的retrofit 源码分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 政字有什么好听的名字
- 下一篇: html input type=file