本文由 伯樂在線 - imesong 翻譯自 meetme。歡迎加入Android小組。轉載請參見文章末尾處的要求。
android
如今,Android應用程序中集成第三方API已十分流行。應用程序都有本身的網絡操做和緩存處理機制,可是大部分比較脆弱,沒有針對網絡糟糕狀況進行優化。感謝Square lnc 這家有創新精神的公司,將信用卡商業交易帶到手機上。如今有了一系列高質量開源庫,支持在Android應用程序中集成。git
如今,咱們要依次學習使用Retrofit、OKHttp和GSON,簡單快速的集成REST API。使用這個組合,咱們須要從Twitch.tv下載並解析一些數據。跟着下面的步驟能夠在幾分鐘內,不用寫繁瑣的模板代碼,完成大部分的REST API集成。github
Retrofitweb
Retrofit簡化了從Web API下載數據,解析成普通的Java對象(POJO)。例如,要從Github 上下載用戶倉庫的信息,你只須要編寫下面的幾行:json
1
2
|
另外,你須要建立倉庫信息類和數據類型。這些代碼也能夠自動生成,下面會介紹如何自動生成。api
整個過程很簡單,相似發送一次有參數的請求或發送POST或HEAD。如何鏈接不一樣類型的API,請查看說明文當。數組
Retrofit的特性之一能夠將處理邏輯添加到請求和響應中。你能夠添加數據到http請求頭部,也能夠攔截驗證失敗的響應重定向到登陸界面。瀏覽器
OKHttp緩存
OKHttp是Android版Http客戶端。很是高效,支持SPDY、鏈接池、GZIP和 HTTP 緩存。默認狀況下,OKHttp會自動處理常見的網絡問題,像二次鏈接、SSL的握手問題。若是你的應用程序中集成了OKHttp,Retrofit默認會使用OKHttp處理其餘網絡層請求。網絡
GSON
GSON是將JSON解析成POJO的Java庫。GSON也能夠將POJO解析成JSON。在Android中,數據對象存儲在SharePreference更加方便。
要使用GSON,首先須要建立相應的POJO數據,再用GSON解析爲POJO對象。解析過程簡單且很是高效。須要瞭解如何建立能夠被GSON解析的POJO對象,請查看說明文檔。Retrofit使用GSON解析JSON數據。
添加庫文件到工程
查找或者編寫API
你可能已有一份API,若是你還在尋找API目錄,我推薦ProgrammableWeb。在這個教程中,咱們會解析Twitch.Tv的數據流。請求格式請參考說明手冊。Twicht.tv請求數據流的JSON格式:
http://api.justin.tv/api/stream/list.json
展現輸出
展現一些API返回的數據,下面的示例是因爲是一個GET請求,只能在瀏覽器中運行,返回數據以下:
1
|
[{
"broadcast_part"
: 4,
"featured"
:
true
,
"channel_subscription"
:
true
,
"audio_codec"
:
"uncompressed"
,
"id"
:
"6640712464"
,
"category"
:
"gaming"
,
"title"
:
"Fnatic xPeke, Normals(ranked down) on smurf"
,
"geo"
:
"DE"
,
"video_height"
: 1080,
"site_count"
: 8014,
"embed_enabled"
:
true
,
"channel"
: {
"subcategory"
:
null
,
"producer"
:
true
,
"image_url_huge"
:
"http://static-cdn.jtvnw.net/jtv_user_pictures/xpeke-profile_image-a182a5fe5a8f239b-600x600.jpeg"
,
"timezone"
:
"Europe/Madrid"
,
"screen_cap_url_huge"
: 「http://static
|
建立POJO
這部分頗有趣,用咱們獲取到的數據自動建立對應的POJO。使用jsonschema2pojo,導入包名、類名和JSON數據,保存爲私有類型。示例中展現的構造器沒法使用,由於JSON數據的根元素是個數組,不是對象。因此我只貼出了數組的第一個元素。展現相關的圖片示例。
集成POJOs
將自動產生的POJOs粘貼到工程中就能夠了。在個人示例工程中,他們在models包中。
使用Retrofit下載(解析)API
建立REST Adapter
建立Adapter,相似設置endPoint。
1
2
3
|
RestAdapter restAdapter =
new
RestAdapter.Builder()
.setEndpoint(
"http://api.justin.tv/api"
)
.build();
|
定義API接口
爲須要鏈接的endPoint定義接口。下面示例中,使用limit和offset,這兩個參數用來控制請求數據位置和大小。詳細說明請參考API文檔。
1
2
3
|
public
interface
TwitchTvApiInterface {
|
你可能會注意到,咱們指望返回的是一組JustinTvStreamData對象,也就是咱們剛纔自動產生的POJO。關於如何定義這個接口的更多信息,請參考Retrofit說明文檔。
建立Twitch.tv 服務
如今咱們已經創建了endPoint,定義了須要的接口。下面須要建立Twitch.TV服務,發送請求。
1
|
TwitchTvApiInterface twitchTvService = restAdapter.create(TwitchTvApiInterface.
class
);
|
使用API
發送API請求十分簡單,只須要使用剛纔建立的服務便可。
1
2
3
4
5
6
7
8
9
10
|
twitchTvService.getStreams(ITEMS_PER_PAGE, pageNumber * ITEMS_PER_PAGE,
new
Callback<List>() {
@Override
public
void
success(List justinTvStreamData, Response response) {
consumeApiData(justinTvStreamData);
}
@Override
public
void
failure(RetrofitError retrofitError) {
consumeApiData(
null
);
}});
|
這裏有一點須要注意,Retrofit會在後臺線程下載並解析API數據,根據結果不一樣(成功或失敗)發送到UI線程。Retrofit也支持在後臺自動下載(這裏沒有顯示)。
數據處理趣事
如今咱們用POJO數據作一些有趣的事情。在這個Demo中,展現了Twitch.Tv頻道的圖片和描述,使用Picasso Library 下載緩存圖片。
參考代碼
你有發現這類工做頗有趣嗎?你是否喜好古樸的賓夕法尼亞雄鹿?你是一名出色的Android開發者嗎? 歡迎聯繫咱們。