Retrofit原始碼 簡單瀏覽

2021-08-18 09:14:03 字數 3166 閱讀 9642

}這裡用到了動態**,這裡的動態**的作用是,你只需要宣告式地寫了乙個介面然後它**這個介面類,事實是並沒有產生乙個實際的類.

public inte***ce apiservice

這是常用的方式,使用宣告式地,寫了乙個介面,getnewlist用註解表明它的請求方式,轉換工廠的方法引數.

如果不用動態**,你也可以像volley,寫乙個request,然後對這個類,新增一些東西,再放到執行緒池中去執行.這樣的做法,導致你所有的類都是要繼承request介面類的.

而它動態**,servicemethod是生成了這個物件,然後通過它,獲取註解的一些資訊通過工廠,生成各種介面卡.然後呼叫okhttp去執行.

loadservicemethod()方法:

synchronized (servicemethodcache)

}return result;

它快取了servicemethod 物件.因為乙個請求包裝類,它需要解析請求的引數,轉換器,介面卡等.看下面的**就知道,做的事較多.

servicemethod

public servicemethod build()

if (!hasbody)

int parametercount = parameterannotationsarray.length;

parameterhandlers = new parameterhandler<?>[parametercount];

for (int p = 0; p < parametercount; p++)

annotation parameterannotations = parameterannotationsarray[p];

if (parameterannotations == null)

parameterhandlers[p] = parseparameter(p, parametertype, parameterannotations);

}if (relativeurl == null && !goturl)

if (!isformencoded && !ismultipart && !hasbody && gotbody)

if (isformencoded && !gotfield)

if (ismultipart && !gotpart)

return new servicemethod<>(this);

}這個build構建方法中,對public inte***ce apiservice這個介面裡宣告的一些東西進行了處理.比如引數的驗證,型別推斷等.

createcalladapter又回到了retforit的:

public calladapter<?, ?> nextcalladapter(@nullable calladapter.factory skippast, type returntype,

annotation annotations)

}......

}從工廠裡取,如果有介面卡了.然後就可以得到返回的型別,call,這個用於建立資料轉換器的時候用.

轉換器:又回到了retrofit

retrofit.responsebodyconverter(responsetype, annotations);它使用的和上面的介面卡類似,從轉換器工廠裡取

for (int i = start, count = converte***ctories.size(); i < count; i++)

}這個工廠,有幾個內建的轉換器,在

builtinconverters中.

requestbodyconverter 請求轉換器,

voidresponsebodyconverter

streamingresponsebodyconverter

bufferingresponsebodyconverter

tostringconverter

建立了servicemethod 後,就開始呼叫它,然後到了calladapter.adapt(call);這時才到具體的資料請求中.

static final class

executorcallbackcall

implements call{},這只是乙個**類.具體的是:

implements call{}這個類,一看到okhttp,就明白,這才是真正請求網路的地方.

delegate.enqueue(new callback() {}這個方法,用到了平台相關的,android裡,在這裡,就轉為主執行緒了.其它部分,全部是從**到okhttpcall去執行的.

它與okhttp是乙個公司開發的,okhttp用於替代httpurlconnection.但還是不夠方便使用,而retrofit的出現,則完善了這方面的功能.它是真正面對使用者的.不再需要知道,http連線,獲取的具體過程了,只通過註解,宣告式的程式設計,就完成了乙個網路請求,甚至返回的結果,也使用了gson這些對映,形成了真正的面對物件了.

關於其中的動態**:

inte***ce service

service proxy = (service) proxy.newproxyinstance(getclass().getclassloader(), new class<?>,

new invocationhandler()

});proxy.perform();

不需要實現類,只需要乙個介面就行了.這邊的invoke沒有返回物件.

Retrofit 原始碼解析

service 定義的介面類 servicemethod service 中的方法 call 引數型別是 r 的 call,實際發起網路請求的類 responsetype r call 的引數型別 如 call的 responsetype 為 aclass calladapter 介面卡,將乙個 c...

Retrofit簡單使用

新增retrofit依賴 compile com.squareup.retrofit2 retrofit 2.3.0 新增gson轉換器的依賴 compile com.squareup.retrofit2 converter gson 2.3.0 配置服務介面 public inte ce apis...

Promise 簡單原始碼

乙個簡單的promise方法執行過程 const promise new promise function resolved,rejusted else 1000 promise.then function res catch function errer 建立乙個建構函式mypromise 傳入乙...