一、概述
最近开始接触
Rerofit,它跟其他的网络请求框架如
Andoid Async Http、
Volley、
OKHttp 一样,都封装了底层的网络请求,仅暴露出一些对开发者来说调用简单的接口。而 Retrofit 底层就集成了 OKHttp。Retrofit 是一套 REST 架构的 Android 网络请求框架,基于注解,提供 JSON to POJO、POJO to JSON, 网络请求封装。
通过注解的方式,我们可以快速完成一个网络请求,包括:GET、POST、DELETE、PUT。这样可以简化我们的开发流程,提高我们项目的开发速率。
由于现在 Retrofit 的版本是
2.0.0-beta2,与之前的版本相比,新版 Retrofit 的 API 接口做出了较大的改动。而网上的 Blog 和 Demo 大多数是针对低版本的,只能说具有参考价值,但缺乏实用性。借着这几天的学习,我将以一个小Demo作为入口,逐步介绍 Retrofit 的基本用法,并也会记录我在这过程中所遇到的问题。
二、实战
在使用 Retrofit 之前,我们首先要导入 Jar 包。
针对 Eclipse 开发环境,添加 Jar 包的过程在这里我就不做详细介绍了,网上一抓一大把。
针对 Android Studio 开发环境,个人很喜欢这个开发工具。各种快捷键的配置,大大提高你的开发效率。现在大多数开发者也慢慢的转移到这个工具上进行开发。对于熟悉 Eclipse 的朋友来说这个过程可能不适应,但本人还是推荐使用这个开发工具。使用 Android Studio 来开发 Android 应用,因为其本身就集成了 Gradle 这个构建工具,所以添加第三方类库就很方便了。详情如下:
选择项目的 app 模块,找到 build.gradle 这个文件,打开后在 dependences 节点上添加第三方类库:
<span style="white-space:pre"> </span>dependences {
...
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
}
同步一下就可以在该工程里使用 Retrofit 了。
Retrofit 可以将你的 Http 请求仅需通过在
Java 接口
方法上添加相应的注解就可以实现。
public interface GitHubService {
@GET("/users/{user}")
Call<User> getUser(@Path("user") String user);
}
然后通过 Retrofit 类来生成该接口的实现类。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com")
.build();
GitHubService service = retrofit.create(GitHubService.class);
接下来就是发送 HTTP 请求了。
<span style="white-space:pre"> </span>Call call = service.getUser("userName);
<span style="white-space:pre"> </span>call.enqueue(new Callback<User>(){
@override
public void onResponse(Response<User> response) {
User model = response.body();
if (model == null) {
ResponseBody responseBody = response.errorBody();
if (responseBody != null) {
try {
System.out.println("Error : " + responseBody.string();
} cartch (Exception e) {
e.printStackTrace();
}
}
} else {
System.out.println("User : " + user.toString());
}
}
@override
public void onFailure(Throwable t) {
System.out.println("Failure : " + t.getMessage());
}
});
注意:因为涉及到网络请求,所以要在 AndroidManifest.xml 配置清单文件中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
同时,由于在 Android 4.0 以上系统在UI线程上执行网络请求会阻塞主线程,因此我们要开启一个子线程来执行网络请求:
new Thread() {
@override
public void run() {
// 将上面的 call.enqueue() 代码放在此处执行;杜宇要在请求结束后刷新 UI,则要结合一下 Handler.
}
}.start();
User 实体类:
public class User {
private String login;
private Integer id;
private String avatarUrl;
private String gravatarId;
private String url;
private String htmlUrl;
private String followersUrl;
private String followingUrl;
private String gistsUrl;
private String starredUrl;
private String subscriptionsUrl;
private String organizationsUrl;
private String reposUrl;
private String eventsUrl;
private String receivedEventsUrl;
private String type;
private Boolean siteAdmin;
private String name;
private String company;
private String blog;
private String location;
private String email;
private Boolean hireable;
private Object bio;
private Integer publicRepos;
private Integer publicGists;
private Integer followers;
private Integer following;
private String createdAt;
private String updatedAt;
// 对应的 get/set 方法
}
private String login;
private Integer id;
private String avatarUrl;
private String gravatarId;
private String url;
private String htmlUrl;
private String followersUrl;
private String followingUrl;
private String gistsUrl;
private String starredUrl;
private String subscriptionsUrl;
private String organizationsUrl;
private String reposUrl;
private String eventsUrl;
private String receivedEventsUrl;
private String type;
private Boolean siteAdmin;
private String name;
private String company;
private String blog;
private String location;
private String email;
private Boolean hireable;
private Object bio;
private Integer publicRepos;
private Integer publicGists;
private Integer followers;
private Integer following;
private String createdAt;
private String updatedAt;
// 对应的 get/set 方法
}
至此,一个关于 Retrofit 的简单例子就完成了。当然,Retrofit 提供的 API 功能还有很多,这也是我接下来要学习的。欢迎有兴趣的朋友一起交流、
探讨。
源码实例:
RetrofitTest