点击此处查看原文

写在前面

现在,Android应用程序中集成第三方API已十分流行。应用程序都有自己的网络操作和缓存处理机制,但是大部分比较脆弱,没有针对网络糟糕情况进行优化。感谢Square lnc 这家有创新精神的公司,将信用卡商业交易带到手机上。现在有了一系列高质量开源库,支持在Android应用程序中集成。

做什么,如何做?

现在,我们要依次学习使用Retrofit、OKHttp和GSON,简单快速的集成REST API。使用这个组合,我们需要从Twitch.tv下载并解析一些数据。跟着下面的步骤可以在几分钟内,不用写繁琐的模板代码,完成大部分的REST API集成。

学习

Retrofit

Retrofit简化了从Web API下载数据,解析成普通的Java对象(POJO)。例如,要从Github 上下载用户仓库的信息,你只需要编写下面的几行:

Java

; html-script: false ]
@GET(“/users/{user}/repos”)
List listRepos(@Path(“user”) String user);
1
2
3
; html-script: false ]
@GET(“/users/{user}/repos”)
List listRepos(@Path(“user”) String user);
另外,你需要创建仓库信息类和数据类型。这些代码也可以自动生成,下面会介绍如何自动生成。

整个过程很简单,类似发送一次有参数的请求或发送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数据。

开始Coding

添加库文件到工程

下载Retrofit、OKHttp、GSON库文件。
逐个添加jar文件到你的工程中。
如果使用Android Studio,可以使用gradle同步这个工程。
查找或者编写API

你可能已有一份API,如果你还在寻找API目录,我推荐ProgrammableWeb。在这个教程中,我们会解析Twitch.Tv的数据流。请求格式请参考说明手册。Twicht.tv请求数据流的JSON格式:
http://api.justin.tv/api/stream/list.json

展示输出

展示一些API返回的数据,下面的示例是由于是一个GET请求,只能在浏览器中运行,返回数据如下:

JavaScript

; html-script: false ]
[{“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
1
2
; html-script: false ]
[{“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数据的根元素是个数组,不是对象。所以我只贴出了数组的第一个元素。展示相关的图片示例。

POJO-Generator

集成POJOs

将自动产生的POJOs粘贴到工程中就可以了。在我的示例工程中,他们在models包中。

使用Retrofit下载(解析)API

创建REST Adapter

创建Adapter,类似设置endPoint。

Java

; html-script: false ]
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(“http://api.justin.tv/api“)
.build();
1
2
3
4
; html-script: false ]
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(“http://api.justin.tv/api“)
.build();
定义API接口

为需要连接的endPoint定义接口。下面示例中,使用limit和offset,这两个参数用来控制请求数据位置和大小。详细说明请参考API文档。

Java

; html-script: false ]
public interface TwitchTvApiInterface {
@GET(“/stream/list.json”)
void getStreams(@Query(“limit”) int limit, @Query(“offset”) int offset, Callback callback);}
1
2
3
4
; html-script: false ]
public interface TwitchTvApiInterface {
@GET(“/stream/list.json”)
void getStreams(@Query(“limit”) int limit, @Query(“offset”) int offset, Callback callback);}
你可能会注意到,我们期望返回的是一组JustinTvStreamData对象,也就是我们刚才自动产生的POJO。关于如何定义这个接口的更多信息,请参考Retrofit说明文档。

创建Twitch.tv 服务

现在我们已经建立了endPoint,定义了需要的接口。下面需要创建Twitch.TV服务,发送请求。

Java

; html-script: false ]
TwitchTvApiInterface twitchTvService = restAdapter.create(TwitchTvApiInterface.class);
1
2
; html-script: false ]
TwitchTvApiInterface twitchTvService = restAdapter.create(TwitchTvApiInterface.class);
使用API

发送API请求十分简单,只需要使用刚才创建的服务即可。

Java

; html-script: false ]
twitchTvService.getStreams(ITEMS_PER_PAGE, pageNumber * ITEMS_PER_PAGE, new Callback() {
@Override
public void success(List justinTvStreamData, Response response) {
consumeApiData(justinTvStreamData);
}

@Overridepublic void failure(RetrofitError retrofitError) {    consumeApiData(null);}});

1
2
3
4
5
6
7
8
9
10
11
; html-script: false ]
twitchTvService.getStreams(ITEMS_PER_PAGE, pageNumber * ITEMS_PER_PAGE, new Callback() {
@Override
public void success(List justinTvStreamData, Response response) {
consumeApiData(justinTvStreamData);
}

@Overridepublic void failure(RetrofitError retrofitError) {    consumeApiData(null);}});

这里有一点需要注意,Retrofit会在后台线程下载并解析API数据,根据结果不同(成功或失败)发送到UI线程。Retrofit也支持在后台自动下载(这里没有显示)。

数据处理趣事

现在我们用POJO数据做一些有趣的事情。在这个Demo中,展示了Twitch.Tv频道的图片和描述,使用Picasso Library 下载缓存图片。

TwitchClient-576x1024

参考代码

示例代码下载。

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. Android(安卓)面试必备 - 计算机网络基本知识(TCP,UDP,Http,https)
  5. Android之ListView使用总结
  6. android adapter的学习
  7. 腾讯微博java(android) sdk 帐户相关api详细介绍
  8. UI开发中所用到特殊方法
  9. android通过浏览器得到手机数据

随机推荐

  1. Android(安卓)Provider 属性
  2. Android(安卓)Map开发基础知识学习笔记
  3. Android(安卓)JobIntentService
  4. android 快速启动相关
  5. ch014 Android(安卓)AppWidget
  6. android 的View Tree和 DecorView(Android
  7. Android(安卓)Service总结01 目录
  8. Android事件处理
  9. Android(安卓)RecyclerView DividerItemD
  10. android - TextView单行显示...或者文字