日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

retrofit 源码分析

發(fā)布時(shí)間:2023/11/27 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 retrofit 源码分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。