Retrofit源碼解析(一):基礎(chǔ)使用

前言

才發(fā)現(xiàn)已經(jīng)有一個月沒更新博客了尺迂,上個月發(fā)布了兩篇Chat:

線性布局和相對布局的實現(xiàn)原理

我的安卓生涯:從6k到25K,都經(jīng)歷了什么

都是高質(zhì)量的內(nèi)容和技術(shù)分享冒掌,所以占用了比較多的時間噪裕,感興趣的朋友可以支持一下我的創(chuàng)作,十分感謝~

今天準備跟大家分享一下Retrofit的用法和源碼的實現(xiàn)原理股毫。Retrofit是對Okhttp的二次封裝的開源庫膳音,目的是讓okhttp使用起來更方便,更簡潔铃诬,通過注解等信息封裝成Okhttp請求祭陷,完成整個網(wǎng)絡(luò)請求的過程,現(xiàn)在已經(jīng)是非常流行的框架之一趣席,是我們技術(shù)學(xué)習(xí)之路的必選內(nèi)容兵志。

Okhttp源碼分析博客地址:https://blog.csdn.net/u011315960/article/details/80017877

源碼地址:Retrofit的github地址

正文

首先我們回顧一下Retrofit的用法:

首先需要定義我們的接口文件,這個類必須是接口類型:

/**
 * Created by li.zhipeng on 2018/8/29.
 */
public interface TestApi {

    /**
     * 模擬GET一個數(shù)據(jù)請求
     */
    @GET
    ResponseWrapper getData(@Url String url);

    /**
     * 模擬POST一個數(shù)據(jù)請求
     */
    @POST
    @FormUrlEncoded
    ResponseWrapper postData(@Url String url, @Field("wd") String key);
}

非常簡單的get請求宣肚,我們需要指定請求的類型@Get想罕,@POST钉寝,@PUT等等弧呐,這寫請求類型的注解可以設(shè)置網(wǎng)絡(luò)請求的相對地址闸迷。如果有參數(shù),還可以指定網(wǎng)絡(luò)請求的參數(shù)俘枫,通過@Field(“paramName”)腥沽,注解內(nèi)的value是提交的參數(shù)對應(yīng)的key。

有些用過Retrofit的朋友可能會問:為什么你的返回類型是ResponseWrapper今阳?

其實這是我通過Retrofit的api指定的返回的類型盾舌,我們可以按照自己的需要指定任何類型蘸鲸。

接下來初始化Retrofit的配置信息,并解析定義的接口文件:

val retrofit = Retrofit.Builder()
                // 必填項
                .baseUrl("http://www.baidu.com")
                .client(OkHttpClient())
                // 對得到的結(jié)果進行轉(zhuǎn)換膝舅,常用的有加密解密仍稀,json轉(zhuǎn)換等等
                .addConverterFactory(StringConvertFactory())
                // 對返回的結(jié)果進行封裝埂息,常用的有之間轉(zhuǎn)化成Rxjava對象
                // 這里我們簡單的進行包裝
                .addCallAdapterFactory(ResponseWrapperCallAdapterFactory())
                .build()

api = retrofit.create(TestApi::class.java)

baseUrl:請求的基礎(chǔ)地址千康,如果沒有參數(shù)中沒有指定@Url地址,真實的網(wǎng)絡(luò)地址是baseUrl + @GET注解的value相對地址琉闪。

client:發(fā)起網(wǎng)絡(luò)請求的OkhttpClient對象颠毙。

addConverterFactory:添加網(wǎng)絡(luò)請求的轉(zhuǎn)換工廠類砂碉,可以處理網(wǎng)絡(luò)請求過程中Request或者Response,例如可以把Response中的數(shù)據(jù)流轉(zhuǎn)換成字符串滴某。

addCallAdapterFactory:設(shè)置網(wǎng)絡(luò)請求的返回類型霎奢。demo中直接返回自定義的ResponseWrapper,所以剛剛的接口文件返回的類型就只能是ResponseWrapper帝美。

接下來看看我自定義的StringConvertFactory:

/**
 * Created by li.zhipeng on 2018/8/29.
 *
 *      把得到的數(shù)據(jù)response轉(zhuǎn)換成String
 */
public class StringConvertFactory extends Converter.Factory {

    @Override
    public Converter<ResponseBody, String> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
        return new Converter<ResponseBody, String>() {
            @Override
            public String convert(@NonNull ResponseBody value) throws IOException {
                return value.string();
            }
        };
    }
}

很簡單悼潭,把response的內(nèi)容取出來舞箍,返回String字符串。

再看看ResponseWrapperCallAdapterFactory:

/**
 * Created by li.zhipeng on 2018/8/29.
 *
 *  把得到網(wǎng)絡(luò)請求結(jié)果String占拍,轉(zhuǎn)換成ResponseWrapper
 */
public class ResponseWrapperCallAdapterFactory extends CallAdapter.Factory  {

    @Override
    public CallAdapter<String, ResponseWrapper> get(@NonNull final Type returnType, @NonNull Annotation[] annotations, @NonNull Retrofit retrofit) {
        return new CallAdapter<String, ResponseWrapper>() {

            @Override
            public Type responseType() {
                return returnType;
            }

            @Override
            public ResponseWrapper adapt(@NonNull Call<String> call) {
                try {
                    return new ResponseWrapper(call.execute().body());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return new ResponseWrapper("error");
            }
        };
    }
}

這里主要是實現(xiàn)adapt方法刷喜,對返回值類型進行轉(zhuǎn)換立砸,這里ResponseWrapper就是一個包裝類颗祝,把得到的String保存起來螺戳。值得注意的是折汞,我們在這里直接發(fā)起了同步的網(wǎng)絡(luò)請求,所以別忘了實際使用中损同,不能在主線程發(fā)起網(wǎng)絡(luò)請求鸟款。

看一下沒什么卵用的ResponseWrapper:

/**
 * Created by li.zhipeng on 2018/8/29.
 * <p>
 * 網(wǎng)絡(luò)請求包裝類
 */
public class ResponseWrapper {

    public String response;

    public ResponseWrapper(String response) {
        this.response = response;
    }

}

最后在MainActivity中發(fā)起網(wǎng)絡(luò)請求:

Thread {
     val result = api.postData("www.baidu.com", "111").response
     runOnUiThread {
          val textView = findViewById<TextView>(R.id.textView)
          textView.text = result
     }
}.start()

看一下運行結(jié)果:

Screenshot_2018-08-29-12-12-34.png

我們已經(jīng)得到了請求的數(shù)據(jù)组哩,Retrofit的基礎(chǔ)使用就是這些,當然還有其他的api蛛砰,這里簡單介紹一下:

callFactory: 跟client一樣暴备,指定運行Okhttp網(wǎng)絡(luò)請求的工廠類们豌,OkhttpClient已經(jīng)實現(xiàn)了Factory中的方法。

callAdapterFactories:同時設(shè)置多個CallAdapterFactoty障癌。
converterFactories:同時設(shè)置多個ConvertFactoty.
callbackExecutor:執(zhí)行callback的線程池涛浙,用的很少摄欲。Android默認是主線程。
validateEagerly:是否一次在創(chuàng)建接口文件代理時我注,解析所有的接口方法迟隅。

總結(jié)

本來想把基礎(chǔ)使用和源碼解析寫成一篇,考慮一下還是分開吧奔缠,誰也不愿意看又臭又長的長篇大論校哎,所以下一篇繼續(xù)分析:Retrofit的源碼瞳步。

demo下載地址:https://github.com/li504799868/RetrofitDemo

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谚攒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子野蝇,更是在濱河造成了極大的恐慌,老刑警劉巖锐想,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赠摇,死亡現(xiàn)場離奇詭異浅蚪,居然都是意外死亡,警方通過查閱死者的電腦和手機洽故,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門时甚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哈踱,“玉大人,你說我怎么就攤上這事开镣。” “怎么了哑子?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我把敞,道長,這世上最難降的妖魔是什么奋早? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮耽装,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掉奄。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布诞仓。 她就那樣靜靜地躺著,像睡著了一般墅拭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谍婉,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音穗熬,去河邊找鬼。 笑死死陆,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的措译。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼规哪,長吁一口氣:“原來是場噩夢啊……” “哼诉稍!你這毒婦竟也來了最疆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤服爷,失蹤者是張志新(化名)和其女友劉穎仍源,沒想到半個月后舔涎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡嚎于,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年匾旭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片女蜈。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡色瘩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出覆山,到底是詐尸還是另有隱情泥栖,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布魏割,位于F島的核電站钞它,受9級特大地震影響殊鞭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜操灿,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一牲尺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦溢豆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽峻村。三九已至,卻和暖如春粘昨,著一層夾襖步出監(jiān)牢的瞬間窜锯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工吞瞪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芍秆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓妖啥,卻偏偏與公主長得像迹栓,于是被迫代替她去往敵國和親俭缓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,139評論 25 707
  • 前言 在Android開發(fā)中,網(wǎng)絡(luò)請求十分常用 而在Android網(wǎng)絡(luò)請求庫中惜姐,Retrofit是當下最熱的一個網(wǎng)...
    Carson帶你學(xué)安卓閱讀 70,734評論 48 393
  • 真好歹袁!今天是周日,又可以好好看書了条舔,泡上一壺自家烤的茶,放著Soft music .如果還能再配上窗外嘀嗒的雨...
    雲(yún)雁閱讀 290評論 0 0
  • 第一天迁杨,好像沒有什么想說,想分享的捷沸。 只愿能夠通過文字,找回丟失的自己痒给,繼續(xù)起航预皇。
    禾火的秋閱讀 167評論 0 0
  • 和林燕的關(guān)系真的是很難用言語來描述清楚。在中學(xué)時代序仙,我們是英語學(xué)習(xí)的好伙伴及競爭者鲁豪,我們也是寫作的相互促進者,我們...
    天山彤老閱讀 702評論 0 0