版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請注明原地址
有兩個星期沒有寫博客了,滿滿的罪惡感啊,所以今天無論怎么著也得寫一篇解解渴了。
最近一直在重構(gòu)畢設的項目,再加上實驗室最近手頭上有兩個項目要寫,事情稍微有點兒多。最近的項目中做的最多的就是網(wǎng)絡請求,以前都是用的okhttp,但是看現(xiàn)在主流的模式都是Retrofit+okhttp+Rxjava,所以,學習了一下Retrofit。
以前也大致看過Retrofit,但是看他的主要特色就是利用的注解的形勢,而我對注解一直都有點兒懵B,所以一直沒有深入學習使用,這次找了一些博客和視頻之后,總算是學會了基本的用法。
下面開始干活
導入Retrofit
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
主要導入三個包,第一個是retrofit的基本功能包,第二個是把請求到的json數(shù)據(jù)映射到對象的轉(zhuǎn)換器包,第三個是一般會結(jié)合rxjava使用的rxjava適配器包
創(chuàng)建業(yè)務請求接口
在我們平時一般的開發(fā)中,網(wǎng)絡請求用的最多的無非就是get、post請求,這里我主要演示一下get請求的實現(xiàn)方式,其他的大體實現(xiàn)思路是一樣的
使用的API是天狗云提供的免費菜譜列表接口傳送門
首先需要定義一個網(wǎng)絡請求接口,如下:
public interface HttpService {
@GET("/api/cook/list")
Call<Tngou> getCook(@Query("page") int page, @Query("rows") int rows);
}
解釋一下這一段代碼
該接口定義了一個getCook的方法,這個方法就是直接用來請求數(shù)據(jù)的,在括號中包括一些參數(shù),使用@query的注解方式表示在該get請求中可以附帶的請求參數(shù),比如在上面我們使用的api中,它包括了一些可選的請求參數(shù)

在我寫的接口方法中選了page和row兩個可選參數(shù)
另外方法的返回類型是一個泛型參數(shù)的call,而泛型寫的是Tngou類型,這個Tngou是我自定義的針對返回的json數(shù)據(jù)映射的一個實體類
之所以這樣寫,是因為到時候在請求返回的結(jié)果response時,經(jīng)過特定轉(zhuǎn)換器的轉(zhuǎn)換,response.body的類型就能直接轉(zhuǎn)換為映射的Tngou型,就不再需要我們另外去針對response,用Gson之類的方式去解析它。
在接口方法getCook的上面使用了@Get的注解,以將getCook方法指定為get請求方式,括號中的參數(shù)"/api/cook/list"并不是不是完整的get請求api地址,而是api地址的子目錄,比如該完整的Api地址是http://www.tngou.net/api/cook/list,那么前面的http://www.tngou.net 是固定網(wǎng)址,而后面的/api/cook/list就是該api的子目錄
到這,請求方法就這么簡單的定義好了,接下來的工作就是實例化一個Retrofit對象,然后利用Rertrofit對象和接口方法去完成網(wǎng)絡請求。
實例化Retrofit對象
實例化Retrofit對象使用的Builder的模式去創(chuàng)建,以完成相關(guān)參數(shù)的設置
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://www.tngou.net")
.addConverterFactory(GsonConverterFactory.create())
.build();
其中basdUrl用來設置api地址的主網(wǎng)址,在這里就是"http://www.tngou.net";
addConvertFactroy用來設置轉(zhuǎn)換器,轉(zhuǎn)換器就是用來將請求的數(shù)據(jù)轉(zhuǎn)換為用戶想要的格式,比如這里我們請求的是json格式的數(shù)據(jù),我們就可以利用Gson轉(zhuǎn)換器將json數(shù)據(jù)轉(zhuǎn)換為映射的實體類,也就是上面提到的,將response.body的類型直接轉(zhuǎn)換為映射的實體類Tngou型;
得到了Retrofit對象,就可以利用它的create方法得到上面定義的網(wǎng)絡請求接口對象,即HttpService的對象,這樣也就把Retrofit對象和請求接口聯(lián)系起來了;
HttpService httpService = retrofit.create(HttpService.class);
既然得到了定義的業(yè)務請求接口HttpService的對象,那么就可以調(diào)用里面的請求方法getCook,該方法返回得到一個Call<Tngou>的對象callCook;
Call<Tngou> cookCall = httpService.getCook(1, 10);
這樣就已經(jīng)生成了一個網(wǎng)絡請求任務cookCall,而請求期望是獲取到菜譜數(shù)據(jù)的一個頁面的十條數(shù)據(jù);
最后調(diào)用callCook的enqueue方法,即異步執(zhí)行網(wǎng)絡請求(當然也有同步執(zhí)行的方法execute()),enqueue方法參數(shù)中有一個CallBack的回調(diào)接口,new 一個接口對象,即能獲取到返回數(shù)據(jù)
cookCall.enqueue(new Callback<Tngou>() {
@Override
public void onResponse(Call<Tngou> call, Response<Tngou> response) {
List<Cook> list=response.body().getList();
for (int i = 0; i <list.size() ; i++) {
String imgUri="http://tnfs.tngou.net/image"+list.get(i).getImg();
String text=list.get(i).getDescription();
imageDataArrayList.add(new ImageData(imgUri,text));
}
handler.sendEmptyMessage(0);
}
@Override
public void onFailure(Call<Tngou> call, Throwable t) {
t.printStackTrace();
}
});
獲取數(shù)據(jù)成功會回調(diào)onResponse方法,失敗會回調(diào)onFailure方法;
這樣一次完整的get請求就完成了,是不是so easy
運行效果圖

好了,基本的使用就先寫到這吧,學完之后發(fā)現(xiàn)Retrofit還是很NB的,封裝的很全面,以后有時間還會來寫一寫Retrofit的其他的一些使用。
另外推薦兩個博客,感覺他們寫的很全面也比較通俗易懂
傳送門:
Retrofit2前篇[基本使用]
Retrofit用法詳解
若有意見或建議,歡迎批評指正
2017.5.7 00:16
806 實驗室