Android学习笔记---开源工具Retrofit的基本使用

Retrofit是一个简化Android网络请求的一个开源工具,本文主要记录Retrofit的基本用法,想要了解更多可以转到Retrofit的官方网站.

依赖配置

要想在项目中使用Retrofit,我们可以通过以下的方式将Retrofit添加到项目中:

Maven
1
2
3
4
5
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.1.0</version>
</dependency>
Gradle
1
2
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

第二句是为了使用Gson进行数据格式的转换.
Retrofit需要运行于 Java7 , Android2.3 以上的版本

基本使用

我们使用豆瓣电影的Top250做为实例,URL为:

https://api.douban.com/v2/movie/top250?start=0&count=10

返回是JSON格式的字符串,由于返回的结果太长在这就不贴出来了.
若我们要使用Retrofit对上面的URL进行访问,首先我们要创建一个对返回结果的封装的Entity.我们将其命名为MovieEntity,他对应于返回数据中的下面的一段数据.

1
2
3
4
5
6
7
{
"title": "肖申克的救赎",
"genres": [
"犯罪",
"剧情"
],
}

为简单这里我只保留标题和类型.而我们设计的MovieEntity如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class MovieEntity {
String title;
ArrayList<String> genres;//可使用列表,数据等存放
/**
* 用于验证返回结果
*/

@Override
public String toString() {
return title + genres.get(0);
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public ArrayList<String> getGenres() {
return genres;
}
public void setGenres(ArrayList<String> genres) {
this.genres = genres;
}
}

Entity的变量名需要和Json数据的名字相同或者采用@SerializedName()注解进行指定对应关系.
由于返回的JSON数据并不只是电影对象,所以还需一个封装返回结果的对象,我们将他命名为HttpResult,其中我们只存放电影的数据,其他数据并不存放:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class HttpResult {
ArrayList<MovieEntity> subjects;
public ArrayList<MovieEntity> getSubjects() {
return subjects;
}
public void setSubjects(ArrayList<MovieEntity> subjects) {
this.subjects = subjects;
}
}
```
有了基本的对象后,我们可以创建请求服务的接口`MovieService`:
```java
public interface MovieService {
@GET("top250")
Call<HttpResult> getTopMovie(@Query("start") int start,@Query("count") int count);
}

其中参数startcount为URL中对应的请求参数,@GET("top250")说明了采用GET方法进行网络请求.我们创建了服务接口后就可以进行网络请求了,在MainActivity中我们编写getMovie()方法进行网络请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void getMovie(){
//基础的URL,与服务接口的参数组成完整的URL
String baseURL="https://api.douban.com/v2/movie/";
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseURL)
.addConverterFactory(GsonConverterFactory.create())
.build();
MovieService service=retrofit.create(MovieService.class);
Call<HttpResult> call=service.getTopMovie(0,10);
call.enqueue(new Callback<HttpResult>() {
@Override
public void onResponse(Call<HttpResult> call, Response<HttpResult> response) {
Log.e("RESULT",response.body().getSubjects().get(0).toString());
}
@Override
public void onFailure(Call<HttpResult> call, Throwable t) {
Log.e("falut",t.getMessage());
}
});
}

通过在onCreate()方法中简单的调用getMovie()后我们可以在Log中看到下面的信息:

1
07-27 16:31:41.605 20945-20945/com.source.kevin.retrofitsample E/RESULT: 肖申克的救赎犯罪

这就证明了Retrofit已经在我们的项目中正常的运行了.