点击此处查看原文

写在前面

现在,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);
}

@Override
public 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);
}

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

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

数据处理趣事

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

TwitchClient-576x1024

参考代码

示例代码下载。

使用Android API最佳实践 Retrofit OKHttp GSON相关推荐

  1. 使用Android API最佳实践

    本文由伯乐在线-imesong翻译自meetme.欢迎加入Android小组.转载请参见文章末尾处的要求. 写在前面 现在,Android应用程序中集成第三方API已十分流行.应用程序都有自己的网络操 ...

  2. Android开发最佳实践《IT蓝豹》

    Android开发最佳实践   移动开发Android经验分享应用GoogleMaterial Design 摘要:前 段时间,Google公布了Android开发最佳实践的一系列课程,涉及到一些平时 ...

  3. android 首页接口设计方案,Android开发最佳实践——1.接口设计

    Android开发最佳实践--1.接口设计 一个项目刚开始的时候,最需要确认的就是接口设计了:数据如何传递,使用什么格式什么协议乃至如何保证安全性.如果一个项目的接口设计不合理--比如没有考虑到安全性 ...

  4. 核心API最佳实践——JDK日志分级

    核心API最佳实践--JDK日志分级 时间:2005-10-29 08:00 来源:网管之家bitsCN.com 字体:[大 中 小] 日志(Log)是什么?字典对其的解释是"对某种机器工作 ...

  5. [教程] Android PHP 最佳实践视频教程

    这几个月实在太忙了,一直没有时间关顾博客,不过好在日前花费了不少心血的视频教程<Android+PHP最佳实践>已经在华章教育和China-Pub上线了,在这里给大家简短的推荐一下吧:本系 ...

  6. Android开发最佳实践

    原文链接:https://github.com/futurice/android-best-practices 转载来源:http://blog.csdn.net/asce1885/article/d ...

  7. Android开发最佳实践---Futurice之见

    原文链接:https://github.com/futurice/android-best-practices 本文是Futurice公司的Android开发人员总结的最佳实践,遵循这些准则可以避免重 ...

  8. ASP.NET Core Web API 最佳实践指南

    原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 介绍 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但是,你难 ...

  9. REST API 最佳实践 – REST 端点设计示例

    在 Web 开发中,REST API 在确保客户端和服务器之间的顺畅通信方面发挥着重要作用. 您可以将客户端视为前端,将服务器视为后端. 客户端(前端)和服务器(后端)之间的通信通常不是超级直接的.因 ...

最新文章

  1. 控制程序仅执行一次 php,PHP流程控制(1)
  2. Django中cookie和session的存、取、删除
  3. not in SQL语句转化为 not exists
  4. 时下流行的9种恶意软件,你都了解吗?
  5. ZOJ 3631 Watashi's BG
  6. ubuntu16.04安装opencv3.1.0(包含opencv_contrib模块)
  7. 游标sql server_使用SQL Server游标–优点和缺点
  8. 408中的计算机组成原理,2021考研计算机大纲408计算机组成原理部分原文解析
  9. Android view 小总结
  10. Google Cloud资源层级, IAM Identity and Access Management, 控制台云交互
  11. Win系统 - 局域网内电脑文件共享
  12. 1001. 会议安排
  13. jQuery Ajax async=false异步改为同步时,导致浏览器假死的处理方法
  14. Renovate - preview
  15. Spring Boot入门(12):一文吃透Spring Boot整合MyBatis-Plus | 保姆级教程,建议收藏
  16. 使用 Google Guava Striped 实现基于 Key 的并发锁
  17. 《python金融数据分析》
  18. 工业类计算机主板维修,工控机电脑主板坏了如何维修
  19. 神剧制作《黑镜》第四季基本剧情,良心制作
  20. java将汉字转成拼音首字母大写字母_Java 将汉字转换为拼音并取首字母大写

热门文章

  1. Nessus详细使用教程
  2. navicat新建数据库的步骤
  3. 大数据python试卷_智慧树大数据分析的PYTHON基础期末考试满分答案
  4. truncate分区表的操作,会导致全局索引失效?
  5. Android mk 引用 jar 包、so 库、aar 包,系统签名
  6. 传腾讯寻求增持育碧股份,目标是成为最大股东
  7. 认识这些词,老外都认为你无敌了~
  8. python中io.textio_关于python的IO读写的二三事
  9. PHP socket使用实例
  10. iommu 工作原理解析之dma remapping