Retrofit2 的使用以及总结

本文介绍了Retrofit2.0相较于1.0的主要变化,包括必须手动设置转换器、同步与异步调用的改进、新增@Url注解、与OkHttp的紧密集成、日志系统的更新及拦截器使用方式的变化,并提供了与RxJava结合使用的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单介绍

retrofit2.0相对retrofit1.0修改了大量api,使用方法有不少变动,我将目前所接触到的针对retrofit2.0的资料进行整理和归类。

参考文章:用 Retrofit 2 简化 HTTP 请求 更新到Retrofit2的一些技巧
参考demo:RxJava 和 Retrofit 结合使用的几个最常见使用方式举例


接下来重点说下2.0相对1.0常用的改动,总结起来如下六点

1. 2.0必须手动设置转换器,1.0如果不设置会启动默认的gson转化器工厂。

  @GET("/repos/{owner}/{repo}/contributors")
  ContributorResponse repoContributors(
    @Path("owner") String owner,
    @Path("repo") String repo);
}
builder.setConverter(new ProtoConverter());
builder.setConverter(new WireConverter());
builder.setConverter(new SimpleXMLConverter());
builder.setConverter(new CustomConverter());

2.我们在某些场景下既需要异步的调用,又需要同步的调用。在 Retrofit 1.0 里,你必须得声明两次这个方法,像下面这样:

interface GitHubService {
  @GET("/repos/{owner}/{repo}/contributors")
  List<Contributor> repoContributors(
    @Path("owner") String owner,
    @Path("repo") String repo);
  @GET("/repos/{owner}/{repo}/contributors")
  void repoContributors(
    @Path("owner") String owner,
    @Path("repo") String repo,
    Callback<List<Contributor>> cb);
}

在2.0中只需要声明一次即可,同步使用clone:

Call<List<Contributor>> call =
  gitHubService.repoContributors("square", "retrofit");
response = call.execute();
// This will throw IllegalStateException:
response = call.execute();
Call<List<Contributor>> call2 = call.clone();
// This will not throw:
response = call2.execute();

异步,需要调用 enqueue 方法:

Call<List<Contributor>> call =
    gitHubService.repoContributors("square", "retrofit");

call.enqueue(new Callback<List<Contributor>>() {
  @Override void onResponse(/* ... */) {
    // ...
  }

  @Override void onFailure(Throwable t) {
    // ...
  }
});

当你将一些异步请求压入队列后,甚至你在执行同步请求的时候,你可以随时调用 cancel 方法来取消请求:

Call<List<Contributor>> call =
  gitHubService.repoContributors("square", "retrofit");
call.enqueue(        );
// or...
call.execute();
// later...
call.cancel();

3.新增@Url标注,允许你直接传入一个请求的 URL。

interface GitHubService {
  @GET("/repos/{owner}/{repo}/contributors")
  Call<List<Contributor>> repoContributors(
      @Path("owner") String owner,
      @Path("repo") String repo);

  @GET
  Call<List<Contributor>> repoContributorsPaginate(
      @Url String url);
}

在repoContributorsPaginate方法中,可以直接传入url即可,@GET不用必须指定action,可以动态的填写。
4. Retrofit 2 现在开始依赖了 OkHttp 了,而且这部分不再支持替换。
5. 目前2.0以及2.1版本不支持日志模式了,需要依靠okhttp提供的日志系统,HttpLoggingInterceptor.使用方法:
先导入:

compile 'com.squareup.okhttp3:logging-interceptor:3.1.2'

然后,创建一个interceptor实例:

HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

再然后,添加到OkHttp client实例中:

OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(httpLoggingInterceptor).build();

最后,把client设置到service interface实现中:

Retrofit retrofit = new Retrofit.Builder()
    .client(okHttpClient)
    .baseUrl(MovieDbApi.END_POINT)
    .build();
movieDbApi = retrofit.create(MovieDbApi.class);

6. interceptor拦截器使用方法变更。在Retrofit2之前,可以通过RequestInterceptor实现:

final RequestInterceptor authorizationInterceptor = new RequestInterceptor() {
        @Override
        public void intercept(RequestInterceptor.RequestFacade request) {
            request.addQueryParam(MovieDbApi.PARAM_API_KEY, "YOUR_API_KEY");
        }
    };

然后

RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint(MovieDbApi.END_POINT)
                .setRequestInterceptor(authorizationInterceptor)
                .build();
movieDbApi = restAdapter.create(MovieDbApi.class);

在Retrofit2中已经不再有效了,因为你现在必须依靠OKHttp interceptors.你可以直接在OKHttp client实例化时进行设置:

OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        HttpUrl url = request.url().newBuilder().addQueryParameter(
MovieDbApi.PARAM_API_KEY, BuildConfig.MOVIE_DB_API_KEY).build();
        request = request.newBuilder().url(url).build();
        return chain.proceed(request);
    }
}).build();

然后像前面那样设置client:

Retrofit retrofit = new Retrofit.Builder()
    .client(okHttpClient)
    .baseUrl(MovieDbApi.END_POINT)
    .build();
movieDbApi = retrofit.create(MovieDbApi.class);

另外再介绍一些retrofit2.0结合rxjava使用的一些常用方法:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值