Android小知識-Retrofit框架的介紹以及使用方式
本平臺的文章更新會有延遲,大家可以關注微信公眾號-顧林海,包括年底前會更新kotlin由淺入深系列教程,目前計劃在微信公眾號進行首發,如果大家想獲取最新教程,請關注微信公眾號,謝謝!
Retrofit是Square公司推出的一個HTTP的框架,主要用於Android和Java,Retrofit會將每一個HTTP的API請求變成一個Java的介面,使用起來非常方便,同時Retrofit又是一個Restful HTTP的網路請求框架的封裝。

image
在上圖中,我們會在應用層發起網路請求,同時請求會經過Retrofit這層,Retrofit會將我們的網路請求的引數進行封裝,最後通過OkHttp層向服務端發起網路,服務端會將響應返回給OkHttp層,OkHttp層再將請求結果交給Retrofit層,最後再返回給應用層。
總結來說:也就是說App應用程式通過Retrofit請求網路,實際上是使用Retrofit介面層封裝請求引數,之後交由OkHttp完成後續的請求操作,在服務端返回資料後,OkHttp將原始資料的結果交給Retrofit,Reftrofit將根據使用者的需求對結果進行解析。
接下來講解Retrofit的用法,首先新增網路訪問許可權以及Retrofit庫的依賴:
許可權:
<uses-permission android:name="android.permission.INTERNET" />
Retrofit庫的依賴:
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
建立服務端返回的資料型別:
public class MyResponse { String title; String imgUrl; int collectNum; }
建立一個用於描述網路請求的介面:
public interface NetworkInterface { @GET("news/newsDetail") Call<MyResponse> getNewsDetails(@QueryMap Map<String,String> map); }
Retrofit將每一個HTTP請求抽象成了Java介面類,同時採用註解方式來描述並配置網路的請求引數,內部通過動態代理將介面的註解轉換成HTTP請求,上面通過註解@GET表示本次請求網路的方式是GET請求,括號內部定義了請求的部分URL ,getNewsDetail方法內的引數使用了@QueryMap註解,說明我們可以傳入任何鍵值對集合Map。
接著建立Retrofit並進行網路請求:
private void initRetrofit() { Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://icould.glh/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); NetworkInterface networkInterface = retrofit.create(NetworkInterface.class); Map<String, String> params = new HashMap<>(); params.put("newsId", "1"); params.put("token", "yud133f"); Call call = networkInterface.getNewsDetails(params); call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { System.out.println(response.body()); } @Override public void onFailure(Call call, Throwable t) { System.out.println("請求錯誤"); } }); }
通過Retrofit的Builder模式建立Retrofit物件,通過baseUrl來指定網路請求的URL,這個URL加上網路請求介面類中通過註解定義的URL,就湊成了完整的URL;通過addConverterFactory方法設定服務返回後資料的解析器,Retrofit可以指定任意的資料解析器,這裡採用的是GSON資料解析器,需要在gradle中引入它的依賴庫。
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
通過addCallAdapterFactory方法設定網路請求的介面卡,Retrofit可以支援多種的網路請求介面卡方式,比如Java8和RxJava,這裡採用RxJava,通過gradle引入它的依賴。
implementation 'com.squareup.retrofit2:adapter-rxjava:2.4.0'
通過Retrofit的create方法建立網路請求介面例項networkInterface,接著呼叫網路請求介面例項中的getNewsDetails方法並傳入相關的鍵值對集合。最後通過Call物件執行非同步或同步請求,這裡通過enqueue方法執行非同步請求並傳入Callback實現兩個回撥方法。
總結:
-
新增Retrofit庫的依賴以及網路許可權。
-
建立伺服器返回的資料型別的類。
-
建立用於描述網路請求的介面。
-
通過建造者模式建立Retrofit例項,並設定URL、資料解析器、網路請求介面卡等等。
-
通過Retrofit的create方法建立網路請求的例項。
-
呼叫網路請求例項中的方法獲取Call併發送網路請求。
關於Retrofit的使用流程已經介紹完畢,下面大致講講Retrofit內部請求的一個流程,為後面原始碼分析做準備。
Retrofit不是網路請求框架,它只是對網路請求框架的封裝,在Retrofit中首先建立Retrofit這個類,它是Retrofit框架統一的一個入口,通過Retrofit的內部類Builder對網路請求的引數進行配置,Builder內部的ServiceMethod物件非常非常的重要,它對應著我們寫好的介面類中的一個方法,通過動態代理的方式將我們自己定義好的介面以及介面中的引數、方法統一轉換成一個個的HTTP請求,ServiceMethod對應的就是我們介面類當中定義好的方法,通過ServiceMethod可以解析方法中的各種註解,最後生成Request物件。建立完ServiceMethod物件之後,就可以建立OkHttpCall請求,通過這個OkHttpCall可以進行同步請求或非同步請求。
在ServiceMethod當中生成了三個非常重要的工廠類,分別是CallAdapter工廠、Converter工廠以及CallFactory。CallAdapter工廠用於生產CallAdatper,在Retrofit中預設會將我們的請求封裝成OkHttp的Call物件, CallAdapter的作用就是將我們的OkHttp的Call轉換成被不同平臺呼叫的介面卡。Converter工廠用於生產資料轉換器Converter,使用Converter可以將返回的Response轉換成我們能使用的Java物件。CallFactory是用於建立Call請求類的,在Retrofit中一個個HTTP請求被封裝成Call類。
有了OkHttpCall以及ServiceMethod中的三個工廠,就可以將網路請求OkHttpCall通過CallAdapter適配不同平臺,在通過Converter解析返回的資料Response,如果是非同步請求在拿到Response後會通過callbackExecutor進行執行緒切換來傳遞資料。

838794-506ddad529df4cd4.webp.jpg
搜尋微信“顧林海”公眾號,定期推送優質文章。