Android日記之Retrofit的基本使用

前言

之前做的項目都是用okhttp框架來進行網絡請求的综膀,然后自己自行封裝呻征,雖然以前也有使用過Retrofit谆级,但是Retrofit本質上還是對okhttp的封裝洞拨,而且面試的時候也會經常的Retrofit框架的使用和原理以及它內部使用的設計模式之類的扯罐,這篇文章主要講述如何使用Retrofit請求框架,以及一些使用的細節(jié)烦衣,畢竟是一個很靈活的使用框架歹河,后續(xù)在寫一篇關于Retrofit的源碼解析和使用了哪些設計模式。

Retrofit的導入

我們主要以是2.0版本來進行講解花吟,第一個是Retrofit秸歧,第二個是Retrofit的Json解析,至于有什么用后面就知道了示辈,當然換成別的Json解析也是可以的

implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'

還有網絡權限也要記得添加:

<uses-permission android:name="android.permission.INTERNET" />


Call接口

首先它需要一個請求的Call接口來進行請求寥茫,Retrofit使用注解的方式來區(qū)分是Get請求還是Post請求等等之類的遣蚀,比如:

public interface ApiService {

    @GET(".")
    Call<ResponseBody> get();
}

這就是一個很簡單的get請求的接口矾麻,泛型是你要返回的Model數(shù)據(jù)的類型,當然如果你的請求地址是動態(tài)的話芭梯,可以這么寫:

@GET("api/{path}")
Call<ResponseBody> get(@Path("path")int path);

Post請求的話可以這么寫:

@FormUrlEncoded
@POST(".")
Call<ResponseBody> post(@Field("ip") String first);

@FormUrlEncoded表示這是一個表單的請求险耀,傳輸數(shù)據(jù)類型為鍵值對,使用@Field注解來標示所對應的String類型數(shù)據(jù)的鍵玖喘,從而組成一組鍵值對進行傳遞甩牺。

當然還有其它的注解:

注解代碼如圖,侵刪

字段注解代碼如圖累奈,侵刪

這里需要注意的是在@GET或者@POST的括號里面如果沒有要請求的URL的話贬派,是不能空著的,空的話默認寫 . 或者 / 都是可以的澎媒,如果是空的話則會報錯:
Call接口報錯如圖

創(chuàng)建Retrfit客戶端對象

//創(chuàng)建Retrfit
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://wanandroid.com/wxarticle/chapters/json/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();

通過Retrofit的Builder()構建者模式可以快速構建客戶端以及所需要的配置搞乏,addConverterFactory()這個方法就是配置你要用哪個Gson對返回的數(shù)據(jù)進行解析。沒錯戒努,這也是為什么要在Call設置泛型的原因请敦,Retrofit是會自動進行Json解析的,然后最后返回的結果就是解析后的Response實體储玫,這樣就不用另外寫解析Json的業(yè)務邏輯侍筛,大大節(jié)省了代碼的行數(shù)。

這里有一個非常需要注意的點撒穷!這里填入的baseUrl()是公共的Url匣椰,后面就是跟著你自己定義接口路徑的Url,這里的baseUrl()填的Url結尾一定要跟一個 / ,否則它也是會報錯的(PS:這里用的請求接口是“玩Android 開放API”的公共API)端礼。

Url報錯如圖

Retrofit的異步請求

//用Retrofit創(chuàng)建接口實例對象
ApiService apiService = retrofit.create(ApiService.class);
//獲取Call對象
Call<DataModel> call = apiService.get();
//開始異步操作
call.enqueue(new Callback<DataModel>() {
    @Override
    public void onResponse(Call<DataModel> call, Response<DataModel> response) {

        Toast.makeText(MainActivity.this, response.body().getData().get(0).getName(), Toast.LENGTH_SHORT).show();
        b1.setText("請求完畢更新UI");
    }

    @Override
    public void onFailure(Call<DataModel> call, Throwable t) {

    }
});

接下來就跟okhttp的請求差不多禽笑,通過Retrofit客戶端創(chuàng)建一個接口的實例對象弛车,然后通過Call進行獲取,最后使用enqueue()來進行異步請求返回一個Callback的回調接口蒲每,回調接口的泛型就是Retrofit客戶端Json解析后的Model纷跛。

結果如圖

這里我們發(fā)現(xiàn)了,我們是可以在回調回來的接口里面進行直接更新UI的操作的邀杏,這也就代表回調回來的接口是在主線程上面的贫奠,不像okhttp那樣回調回來的接口還是在子線程上,我們還需要通過Handler來進行更新UI的操作望蜡。

返回原始Json字段

剛剛也說了唤崭,Retrofit返回過來的是已經經過Json解析過的Response對象,但是有時候Json字段是不斷更新的話脖律,你的Model也要進行相應的更新谢肾,這就需要返回原始的字段了,Retrofit本身沒提供這個方法小泉,但是畢竟是封裝okhttp芦疏,它是可以返回原始的Json字段的。

@GET(".")
Call<ResponseBody> get();
//創(chuàng)建Retrfit
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://wanandroid.com/wxarticle/chapters/json/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();

//用Retrofit創(chuàng)建接口實例對象
ApiService apiService = retrofit.create(ApiService.class);
//獲取Call對象
Call<ResponseBody> call = apiService.get();
//開始異步操作
call.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {

        String json = null;
        try {
            json = response.body().string();
        }catch (Exception e){
            e.printStackTrace();
        }


        Toast.makeText(MainActivity.this, json, Toast.LENGTH_SHORT).show();
        b1.setText("請求完畢更新UI");
    }

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {

    }
});

其實只要把Call要傳入的泛型接口改成ResponseBody就好了微姊,對應的回調接口也要改成ResponseBody酸茴,ResponseBody是okhttp的Response的返回體,所以就可以通過string()方法返回就好了兢交。

Json返回結果如圖

參考

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末薪捍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子配喳,更是在濱河造成了極大的恐慌酪穿,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晴裹,死亡現(xiàn)場離奇詭異被济,居然都是意外死亡,警方通過查閱死者的電腦和手機息拜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門溉潭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人少欺,你說我怎么就攤上這事喳瓣。” “怎么了赞别?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵畏陕,是天一觀的道長。 經常有香客問我仿滔,道長惠毁,這世上最難降的妖魔是什么犹芹? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮鞠绰,結果婚禮上腰埂,老公的妹妹穿的比我還像新娘。我一直安慰自己蜈膨,他們只是感情好屿笼,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著翁巍,像睡著了一般驴一。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灶壶,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天肝断,我揣著相機與錄音,去河邊找鬼驰凛。 笑死胸懈,一個胖子當著我的面吹牛,可吹牛的內容都是我干的洒嗤。 我是一名探鬼主播箫荡,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼魁亦,長吁一口氣:“原來是場噩夢啊……” “哼渔隶!你這毒婦竟也來了?” 一聲冷哼從身側響起洁奈,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤间唉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后利术,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呈野,經...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年印叁,在試婚紗的時候發(fā)現(xiàn)自己被綠了被冒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡轮蜕,死狀恐怖昨悼,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情跃洛,我是刑警寧澤率触,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站汇竭,受9級特大地震影響葱蝗,放射性物質發(fā)生泄漏穴张。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一两曼、第九天 我趴在偏房一處隱蔽的房頂上張望皂甘。 院中可真熱鬧,春花似錦悼凑、人聲如沸叮贩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽益老。三九已至,卻和暖如春寸莫,著一層夾襖步出監(jiān)牢的瞬間捺萌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工膘茎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桃纯,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓披坏,卻偏偏與公主長得像态坦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子棒拂,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內容