Retrofit源碼分析

一. 基本使用

https://square.github.io/retrofit/#introduction

//retrofit
implementation 'com.squareup.retrofit2:retrofit:2.7.2'
implementation 'com.squareup.retrofit2:converter-gson:2.7.2'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.7.2'
Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://www.weater.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        IWeather story = retrofit.create(IWeather.class);
        Call<ResponseBody> call = story.getWeather("202.202.33.33");
        call.execute();
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            }
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
            }
        });
網(wǎng)絡(luò)請求流程

App應(yīng)用程序通過Retrofit請求網(wǎng)絡(luò),實(shí)際上是使用Retrofit接口層封裝請求參數(shù),之后由OkHttp完成后續(xù)的請求操作。在服務(wù)端返回?cái)?shù)據(jù)之后,OkHttp將原始的結(jié)果交給Retrofit,Retrofit根據(jù)用戶的需求對結(jié)果進(jìn)行解析。

二. Call對象

問題:
Retrofit的Call對象是OKHttp的RealCall對象嗎?跟著代碼來看看。

  1. 通過動(dòng)態(tài)代理類執(zhí)行請求。執(zhí)行invoke方法返回結(jié)果,


  2. 在HttpServiceMethod類中實(shí)現(xiàn)了invoke方法,HttpServiceMethod類的作用是將接口方法的調(diào)用調(diào)整為HTTP調(diào)用??梢钥吹?在代碼中創(chuàng)建了OKHttpCall,最最后調(diào)用了CallAdapter類實(shí)現(xiàn)的adapt方法,這個(gè)方法的作用是返回一個(gè)委托給Call對象的實(shí)例。


  3. 在DefaultCallAdapterFactory類中,adapt方法的實(shí)現(xiàn)。


  4. ExecutorCallbackCall類實(shí)現(xiàn)了Call接口,delegate對象是傳過來的OkHttp中RealCall對象。我們知道,在OkHttp中調(diào)用異步返回?cái)?shù)據(jù)后還是在子線程中,這里retrofit通過callbackExecutor將結(jié)果發(fā)送到了主線程中,在Android平臺中用了Handler。



    通過代碼分析,Retrofit在默認(rèn)情況下Call對象是DefaultCallAdapterFactory.ExecutorCallbackCall。

二. 動(dòng)態(tài)代理

代理類在程序運(yùn)行時(shí)創(chuàng)建的代理方式。

三. 設(shè)計(jì)模式

建造者模式

Retrofit對象通過Builder內(nèi)部類來構(gòu)建。

觀察者模式


call對象是被觀察者,Callback為觀察者。

外觀模式

定義:提供了一個(gè)統(tǒng)一接口,用來訪問子系統(tǒng)中的一群接口。外觀定義了一個(gè)高層接口,讓子系統(tǒng)更容易使用。
Retrofit類就應(yīng)用了外觀模式。

工廠模式

靜態(tài)工廠方法

CallAdapter也應(yīng)用了工廠模式。

策略模式

CallAdapter類中的adapt方法,產(chǎn)生具體的實(shí)現(xiàn)。



工廠模式強(qiáng)調(diào)的是生產(chǎn)不同的對象,策略模式強(qiáng)調(diào)的是不同對象策略方法的實(shí)現(xiàn)。

適配器模式

CallAdapter中的get方法,實(shí)現(xiàn)了切換線程的功能。
addCallAdapterFactory

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容