Android API 最佳使用實踐與學(xué)習(xí)
現(xiàn)在,Android應(yīng)用程序中集成第三方API已十分流行。應(yīng)用程序都有自己的網(wǎng)絡(luò)操作和緩存處理機制,但是大部分比較脆弱,沒有針對網(wǎng)絡(luò)糟糕情況進行優(yōu)化。感謝Square lnc 這家有創(chuàng)新精神的公司,將信用卡商業(yè)交易帶到手機上?,F(xiàn)在有了一系列高質(zhì)量開源庫,支持在Android應(yīng)用程序中集成。
做什么,如何做?
現(xiàn)在,我們要依次學(xué)習(xí)使用Retrofit、OKHttp和GSON,簡單快速的集成REST API。使用這個組合,我們需要從Twitch.tv下載并解析一些數(shù)據(jù)。跟著下面的步驟可以在幾分鐘內(nèi),不用寫繁瑣的模板代碼,完成大部分的REST API集成。
學(xué)習(xí)
Retrofit
Retrofit簡化了從Web API下載數(shù)據(jù),解析成普通的Java對象(POJO)。例如,要從GitHub 上下載用戶倉庫的信息,你只需要編寫下面的幾行:
- @GET("/users/{user}/repos")
- List listRepos(@Path("user") String user);
另外,你需要創(chuàng)建倉庫信息類和數(shù)據(jù)類型。這些代碼也可以自動生成,下面會介紹如何自動生成。
整個過程很簡單,類似發(fā)送一次有參數(shù)的請求或發(fā)送POST或HEAD。如何連接不同類型的API,請查看說明文當(dāng)。
Retrofit的特性之一可以將處理邏輯添加到請求和響應(yīng)中。你可以添加數(shù)據(jù)到http請求頭部,也可以攔截驗證失敗的響應(yīng)重定向到登錄界面。
OKHttp
OKHttp是Android版Http客戶端。 非常高效,支持SPDY、連接池、GZIP和 HTTP 緩存。默認情況下,OKHttp會自動處理常見的網(wǎng)絡(luò)問題,像二次連接、SSL的握手問題。如果你的應(yīng)用程序中集成了OKHttp,Retrofit默認 會使用OKHttp處理其他網(wǎng)絡(luò)層請求。
GSON
GSON是將JSON解析成POJO的Java庫。GSON也可以將POJO解析成JSON。在Android中,數(shù)據(jù)對象存儲在SharePreference更加方便。
要使用GSON,首先需要創(chuàng)建相應(yīng)的POJO數(shù)據(jù),再用GSON解析為POJO對象。解析過程簡單且非常高效。需要了解如何創(chuàng)建可以被GSON解析的POJO對象,請查看說明文檔。Retrofit使用GSON解析JSON數(shù)據(jù)。
開始Coding
添加庫文件到工程
查找或者編寫API
你可能已有一份API,如果你還在尋找API目錄,我推薦ProgrammableWeb。在這個教程中,我們會解析Twitch.Tv的數(shù)據(jù)流。請求格式請參考說明手冊。Twicht.tv請求數(shù)據(jù)流的JSON格式:
http://api.justin.tv/api/stream/list.json
展示輸出
展示一些API返回的數(shù)據(jù),下面的示例是由于是一個GET請求,只能在瀏覽器中運行,返回數(shù)據(jù)如下:
- [{"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
創(chuàng)建POJO
這部分很有趣,用我們獲取到的數(shù)據(jù)自動創(chuàng)建對應(yīng)的POJO。使用jsonschema2pojo,導(dǎo)入包名、類名和JSON數(shù)據(jù),保存為私有類型。示例中展示的構(gòu)造器無法使用,因為JSON數(shù)據(jù)的根元素是個數(shù)組,不是對象。所以我只貼出了數(shù)組的***個元素。展示相關(guān)的圖片示例。
集成POJOs
將自動產(chǎn)生的POJOs粘貼到工程中就可以了。在我的示例工程中,他們在models包中。
使用Retrofit下載(解析)API
創(chuàng)建REST Adapter
創(chuàng)建Adapter,類似設(shè)置endPoint。
- RestAdapter restAdapter = new RestAdapter.Builder()
- .setEndpoint("http://api.justin.tv/api")
- .build();
定義API接口
為需要連接的endPoint定義接口。下面示例中,使用limit和offset,這兩個參數(shù)用來控制請求數(shù)據(jù)位置和大小。詳細說明請參考API文檔。
- public interface TwitchTvApiInterface {
- @GET("/stream/list.json")
- void getStreams(@Query("limit") int limit, @Query("offset") int offset, Callback<List> callback);}
你可能會注意到,我們期望返回的是一組JustinTvStreamData對象,也就是我們剛才自動產(chǎn)生的POJO。關(guān)于如何定義這個接口的更多信息,請參考Retrofit說明文檔。
創(chuàng)建Twitch.tv 服務(wù)
現(xiàn)在我們已經(jīng)建立了endPoint,定義了需要的接口。下面需要創(chuàng)建Twitch.TV服務(wù),發(fā)送請求。
- TwitchTvApiInterface twitchTvService = restAdapter.create(TwitchTvApiInterface.class)
使用API
發(fā)送API請求十分簡單,只需要使用剛才創(chuàng)建的服務(wù)即可。
- 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數(shù)據(jù),根據(jù)結(jié)果不同(成功或失?。┌l(fā)送到UI線程。Retrofit也支持在后臺自動下載(這里沒有顯示)。
數(shù)據(jù)處理趣事
現(xiàn)在我們用POJO數(shù)據(jù)做一些有趣的事情。在這個Demo中,展示了Twitch.Tv頻道的圖片和描述,使用Picasso Library 下載緩存圖片。
參考代碼