retrofit 2.0 android 教程,初識Retrofit2.0

Retrofit無疑是當下最流行的Android網絡請求框架了,是Square提供的開源產品。官方網站是這樣介紹Retrofit的—-A type-safe HTTP client for Android and Java,為Android平臺的應用提供一個類型安全的HTTP客戶端。Retrofit 是一套注解形式的網絡請求封裝庫,它的強大在于讓代碼結構更加清晰,它可以直接解析JSON數據變成JAVA對象,支持回調操作,處理不同的結果。

2.準備工作

添加依賴:

在AndroidStudio的項目中,在build.gradle文件中添加以下引用:

compile 'com.squareup.retrofit2:retrofit:2.1.0'

數據準備:

使用okhttp請求網絡數據的時候,我們需要把服務器返回的JSON數據手動轉換成我們的Java對象。而在上文我們提到,Retrofit可以直接解析JSON數據變成JAVA對象,這也是Retrofit靈活與強大的體現。看看怎么實現的

compile 'com.squareup.retrofit2:converter-gson:2.1.0'

首先添加以上引用,這里除了gson以外,還有其他的選擇。Retrofit自動轉化的核心就是根據服務器返回的json數據定制一個javabean,舉個例子:

9953c7ed715d3691f81a1f5674fbbe47.png

服務器返回的很常見的一種數據類型,jsonobject對象里面包括一個jsonarray數組,數組里面包括很多jsonobject對象。我們需要拿到的就是這些jsonobject里的id與name的。看看定制的javabean該怎么寫:

public class CityManager {

private List<CityBean> cities;

public List<CityBean> getCities() {

return cities;

}

public void setCities(List<CityBean> cities) {

this.cities = cities;

}

public class CityBean {

private String id;

private String name;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

}

這里有一點需要特別注意的是:保證我們定制的javabean對象的字段要和服務器返回的數據字段一一對應,不然解析會出錯

3.基本使用

1.get請求

請求方式為get,請求參數為clientVersion與version,請求數據為城市的id與name,那么使用Retrofit完成數據請求的流程如下:

public class ApiService {

public static final String RES_GET_CITIES_LIST = "Base/getCities";

public interface CityService {

@GET(RES_GET_CITIES_LIST)

Call<CityManager> getCity

(@QueryMap Map<String, String> queryMap);

}

}

retrofit在使用過程中,需要定義一個接口對象,@GET標識為get請求,@GET中所填寫的value值和baseUrl組成完整的路徑,baseUrl在構造retrofit對象時給出。@QueryMap 標識為接口查詢的關鍵字,這里需要的參數有兩個,所以我使用了@QueryMap,與下面這種寫法是等價的:

Call getCity

(@Query("clientVersion") String clientVersion, @Query("version") String version);

接口中的方法必須要有返回值,這里將我們定制的javabean對象傳進去即可。

public static final String BASE_URL = "http://111.111.1.11/";

Map queryMap = new HashMap<>();

queryMap.put("clientVersion", "205002");

queryMap.put("version", "1622");

Retrofit retrofit = new Retrofit.Builder()

.baseUrl(BASE_URL)

.addConverterFactory(GsonConverterFactory.create())

.build();

ApiService.CityService cityService = retrofit.create(ApiService.CityService.class);

Call call = cityService.getCity(queryMap);

call.enqueue(new Callback()

{

@Override

public void onResponse(Call call, Response response)

{

ArrayList cityNames = new ArrayList<>();

ArrayList cityIds = new ArrayList<>();

for (CityManager.CityBean city : response.body().getCities()) {

cityNames.add(city.getName());

cityIds.add((city.getId()));

}

}

@Override

public void onFailure(Call call, Throwable t)

{

//進行異常情況處理

}

});

Retrofit的構建使用的是構造者模式,指定一個baseUrl,添加一個對象轉換器,用于將服務器返回的數據轉換成對應實體類對象。構造完成以后,調用create方法就可以拿到我們的接口實例。然后再調用我們之前定義好的獲取城市的方法,得到一個call對象,通過call.enqueue即可完成異步的網絡請求。最后在數據請求成功的時候,通過response.body()即可拿到我們定義在Call< T >中需要返回的對象,數據請求失敗的時候,進行異常的處理。

2.post請求

同樣是上面的url,如果改為post請求,要求提交的參數有兩個,userId:1001,userName:kaikai,那我們應該怎樣實現呢:

public class ApiService {

public static final String RES_GET_CITIES_LIST = "Base/getCities";

public interface CityService {

@POST(RES_GET_CITIES_LIST)

@FormUrlEncoded

Call<CityManager> getCity

(@QueryMap Map<String, String> queryMap,@FieldMap Map<String, String> queryBody);

}

}

@POST標識為post請求,@FormUrlEncoded 與 @FieldMap注解結合表示以表單的方式傳遞鍵值對,與下面這兩種寫法是等價的:

Call getCity

(@QueryMap Map queryMap, @Field("userId") String userId, @Field("userName") String userName);

這種寫法很好理解,將FieldMap拆分成了兩個Field

Call getCity(@QueryMap Map queryMap, @Body User user);

@Body注解標識的是我們的post參數對象,在使用的時候是:

cityService.getCity(queryMap,new User("1001","kaikai"));

與之對應的User實體類為:

public class User {

private String userId;

private String userName;

public User(String userId, String userName) {

this.userId = userId;

this.userName = userName;

}

}

感覺這種請求方式靈活性不是很高,需要通過傳參來構造一個參數對象。沒有@FormUrlEncoded 與 @FieldMap這種方式靈活。

Map queryBody = new HashMap<>();

queryMap.put("userId", "1001");

queryMap.put("userName", "kaikai");

Call call = cityService.getCity(queryMap,queryBody);

請求網絡數據的時候,以上是需要變化的地方,其他的地方保持不變。

4.常用配置

1.設置打印攔截器

compile 'com.squareup.okhttp3:logging-interceptor:3.4.0-RC1'

首先添加依賴,進行log的打印

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();

logging.setLevel(HttpLoggingInterceptor.Level.BODY);

HttpLoggingInterceptor 是一個攔截器,用于輸出網絡請求和結果的 Log,可以配置 level 為 BASIC / HEADERS / BODY,查看源碼它們級別依次是:

Logs request and response lines

Logs request and response lines and their respective headers

Logs request and response lines and their respective headers and bodies (if present)

這里我們選擇BODY即可,會打印出網絡請求的url,頭部信息headers,返回數據bodies所有信息

2.設置連接與讀取超時

OkHttpClient okHttpClient = new OkHttpClient.Builder()

.connectTimeout(30, TimeUnit.SECONDS)

.readTimeout(30, TimeUnit.SECONDS)

.addInterceptor(logging)

.build();

設置連接超時以及讀取超時,然后將我們設置的攔截器添加進來。最后記得調用Retrofit.Builder()的.client(okHttpClient)方法,將我們已經設置好的okHttpClient關聯好。

5.簡單封裝

/**

* Created by tangyangkai on 16/6/29.

*/

public class ApiWrapper {

public static final String BASE_URL = "http://111.111.1.11/";

private Retrofit retrofit;

private static ApiWrapper instance;

private String token;

private ApiWrapper() {

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();

logging.setLevel(HttpLoggingInterceptor.Level.BODY);

OkHttpClient okHttpClient = new OkHttpClient.Builder()

.connectTimeout(30, TimeUnit.SECONDS)

.readTimeout(30, TimeUnit.SECONDS)

.addInterceptor(logging)

.build();

retrofit = new Retrofit.Builder()

.baseUrl(BASE_URL)

.addConverterFactory(GsonConverterFactory.create())

.addCallAdapterFactory(RxJavaCallAdapterFactory.create())

.client(okHttpClient)

.build();

}

public static ApiWrapper getInstance() {

if (instance == null) {

synchronized (ApiWrapper.class) {

if (instance == null) {

instance = new ApiWrapper();

}

}

}

return instance;

}

public <T> T create(Class<T> services) {

return retrofit.create(services);

}

}

單例模式構建的一個ApiWrapper,這樣就不用每次請求網絡數據的時候去構建一個retrofit,使用的時候也很方便:

ApiService.CityService cityService = ApiWrapper.getInstance().create(ApiService.CityService.class);

Call call = cityService.getCity(queryMap);

其他的代碼與前面的保持一致即可。

Retrofit的靈活與強大遠不止這些,比如訪問動態url,設置網絡緩存,管理cookie,自定義轉換器等,以后項目中有用到的地方再更新博客。我也是最近才從okHttp轉戰Retrofit的,博客有不當的地方歡迎指正。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530473.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530473.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530473.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

怎么創建計算機快捷方式到桌面兩種方法,使用腳本主機創建Windows快捷方式 - Windows Client | Microsoft Docs...

如何使用腳本宿主創建Windows快捷方式12/03/2020本文內容本文介紹如何通過使用 Microsoft Windows Script Host (WSH) Visual FoxPro 創建桌面快捷方式。適用于&#xff1a; Windows 10 - 所有版本&#xff0c;Windows Server 2012 R2原始 KB 編號&#xff1a; 244677摘要WS…

swagger-ui.html 404,解決訪問swagger2報404問題

近來為了項目的接口文檔&#xff0c;而集成了swagger2&#xff0c;但是集成完畢后&#xff0c;訪問swagger-ui.html卻報404&#xff0c;檢查后發現&#xff0c;原來是被攔截了。下面寫一下我的解決方法。首先新建 WebConfig類實現WebMvcConfigurer接口&#xff0c;WebMvcConfig…

正確使用計算機說課稿,《初識計算機》說課稿

說課稿我說課的題目是《初識計算機》首先說教材&#xff0c;我校信息技術課程沒有專用教材&#xff0c;依據柳河縣教師進修學校小學三年級信息技術考核標準&#xff0c;我根據大連理工出版社出版的小學信息技術教材內容進行修改之后&#xff0c;用于我校三年級信息技術課程。本…

小學生學計算機編程的必要,小學生學編程,真的那么重要嗎

原標題&#xff1a;小學生學編程&#xff0c;真的那么重要嗎編程簡單的說就是告訴計算機要做什么。人類需要將解決問題的思路、方法和手段通過計算機能夠理解的形式告訴計算機&#xff0c;使得計算機能夠根據人的指令一步一步去工作&#xff0c;完成某種特定的任務。計算機是迄…

家用計算機機箱怎么選,DIY裝機怎么選擇電腦機箱 新手必讀的電腦主機箱選購指南...

在這個講究顏值的時代&#xff0c;對于一些主要外觀的外觀黨來說&#xff0c;內外皆修的機箱也是算重要的。DIY裝機怎么選擇電腦機箱&#xff1f;下面裝機之家小編就來談下新手必讀的電腦主機箱選購指南&#xff0c;對于裝機選擇機箱困難癥的朋友不妨來看看。一、首先要明白自己…

計算機啟動應用程序的方法,excel的程序_Excel2010中啟動應用程序的三種方法

使用Excel時&#xff0c;需要先啟動應用程序&#xff0c;怎么去進行操作啟動它?今天&#xff0c;學習啦小編就教大家在Excel2010中啟動應用程序的三種方法。Excel2010中啟動應用程序的三種步驟如下&#xff1a;1.開始菜單在桌面上&#xff0c;單擊“開始”&#xff0c;“所有程…

西安工業學院計算機系王翊,西安文理學院藝術學院

“愛的長歌”聲樂教學與實踐匯報音樂會——王翊師生音樂會圓滿結束6月26日我院第八場“愛的長歌”聲樂教學與實踐匯報音樂會—王翊師生音樂會圓滿結束。音樂會受到老師和同學的一致贊譽。整場音樂會高潮迭起&#xff0c;掌聲不斷。音樂會的學生由16級音樂表演專業的聲樂方向的同…

計算機控制系統的穩態誤差,計算機控制系統的穩態誤差.doc

計算機控制系統的穩態誤差計算機控制系統報告--計算機控制系統的穩態誤差在計算機控制系統中存在穩態誤差。怎樣計算穩態誤差呢&#xff1f;在連續系統中&#xff0c;穩態誤差的計算可以通過兩種方法計算&#xff1a;一是建立在拉氏變換中值定理基礎上的計算方法&#xff0c;可…

夢見計算機房,夢見未來家里有機房是什么意思?

吉兇指數&#xff1a;88(由佛滔居士根據數理文化得出&#xff0c;僅供參考)夢見未來&#xff0c;代表的是成就與幸福。夢見未來&#xff0c;通常免征希望&#xff0c;生活將出現轉變。女性夢見未來&#xff0c;表明你是一名很有頭腦的女性。這個夢預示著你將來的生活很富足也很…

計算機如何制作U盤啟動盤,電腦如何制作U盤啟動盤

為什么要制作U盤啟動盤&#xff1f;U盤啟動盤是什么&#xff1f;今天小編和大家普及一下&#xff0c;什么是U盤啟動盤。就是一個簡簡單單的U盤&#xff0c;經過裝機工具軟件就變成了一個裝有PE鏡像文件的U盤&#xff0c;通過這個啟動盤可以進入PE系統對電腦進行重裝系統。話不多…

c 服務器二次驗證碼,V5驗證官網 - 基礎套餐免費 -滑塊驗證,行為驗證,防刷驗證 - 文檔...

平臺對接V5驗證前后端對接流程如下圖所示&#xff1a;前后端調用時序圖對接V5驗證分為業務網站后臺api對接以及業務前端代碼引入兩部分。業務網站后臺獲取驗證Token及驗證服務器(getToken)用于網站后臺定時通過V5控制臺刷新獲取驗證所需要的Token及驗證服務器地址。Token有效期…

戰隊服務器人員位置,和平精英:職業戰隊如何分配成員位置?5大定位劃出5種職位...

#百度APP&百家號杯和平精英#隨著時間的推進&#xff0c;距離百家號杯的決賽越來越近了&#xff1b;一百只精英隊伍你爭我搶都想要爭取冠軍的寶座。在最新的一場循環賽當中SC戰隊以70分的總積分占領榜首&#xff0c;Dae戰隊以69分的總積分緊隨其后排名第二。雖說SC拿到了循環…

sony電視播放服務器文件,sony電視怎么樣 sony電視支持視頻格式【圖文詳解】

現在&#xff0c; 電視機 對于每個家庭來說已然不是什么奢侈品&#xff0c;并且已經成為必備的家庭電器之一。其實&#xff0c;國產電視機中也有不少的知名品牌&#xff0c;但是許多消費者對國外的電子技術持有更高的認可度&#xff0c;因此下面小編就來跟大家講講sony電視&…

css三欄布局技巧,CSS-三欄布局的常用6種方法

三欄布局一般指左右兩欄固定寬度&#xff0c;中間一欄自適應的布局方法&#xff0c;也是許多網站常用的布局方式。如下圖&#xff1a;該示例在一個html文件中編寫&#xff0c;為方便起見&#xff0c;預先寫好一個通用的css&#xff0c;左右寬度都為100px&#xff1b;1.浮動三欄…

關閉服務器系統關機事件,Windows Server 2012 系統提示意外關閉,事件ID:6008

日志名稱: System來源: EventLog日期: 2020/7/20 11:10:18事件 ID: 6008任務類別: 無級別: 錯誤關鍵字: 經典用戶: 暫缺計算機: WIN-GVIJQ6J6IH5描述:上一次系統的 11:06:28 在 ?…

lol新服務器怎么發信息,《英雄聯盟手游》國服新消息 最新玩法發布

大家期待已久的《英雄聯盟手游》終于有新消息了&#xff0c;此次發布的消息主要是介紹《英雄聯盟手游》的玩法&#xff0c;國服具體發布時間并沒有公布。那么接下來看看此次發布的具體內容吧。關注白森森&#xff0c;永遠不迷路!一、英雄類型英雄聯盟手游的英雄類型分類與端游一…

jdk、jre及jvm的關系

很多程序員已經干了一段時間java了依然不明白jdk與jre的區別。 JDK就是Java Development Kit.簡單的說JDK是面向開發人員使用的SDK&#xff0c;它提供了Java的開發環境和運行環境。SDK是Software Development Kit 一般指軟件開發包&#xff0c;可以包括函數庫、編譯程序等。 …

我的理解之JAVA中的4種訪問權限

一、Java中有四種訪問權限&#xff0c;private、default&#xff08;一般省略&#xff09;、public、protected。 private: Java語言中對訪問權限限制的最窄的修飾符&#xff0c;一般稱之為“私有的”。被其修飾的屬性以及方法只能被該類的對象訪問&#xff0c;其子類不能訪問&…

ssh連接阿里云服務器遇到的坑

1. 出現‘Host key verification failed.’ 解決方案在這里找到&#xff1a; https://askubuntu.com/questions/45679/ssh-connection-problem-with-host-key-verification-failed-error 2. 自動斷開—每隔一兩分鐘就自動斷開 參考&#xff1a; https://superuser.com/quest…

云服務器文件傳輸問題

最近再做一個web項目&#xff0c;目前決定先把應用放在云服務器上。我選擇的云主機是aliyun的Ubuntu 16.04主機。部署好云主機環境后&#xff0c;就需要把我在本地開發好的程序上傳到云主機了。剛開始打算用ftp協議來傳輸&#xff0c;于是參照網上的教程&#xff08;Ubuntu 16.…