更新到Retrofit2的一些技巧

2024-04-03 20:38
文章标签 技巧 更新 retrofit2

本文主要是介绍更新到Retrofit2的一些技巧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文链接:Tips on updating to Retrofit 2
简述地址:更新到Retrofit2的一些技巧

ps:其实我老早就更新到Retrofit2了 但是不同的beta版目前改变还是挺大的,如果你在用的话 ,要时刻跟进并查看它的changelog.该文章还是比较倾向于1.9升级2.0 但是就像前面说的 beta2到beta4改变也是非常大的 所以同样可以参考用于备忘

Retrofit2.0已经公开发布几个月了,但是现在依然是beta版,一些开发者已经开始从之前的版本进行升级,虽然官方已经提供了文档,文章或博客让你了解最新版的相关信息,但是在StackOverflow还是可以看到一些提问关于在升级版本的过程中怎么处理常见功能像logging打印日志,添加request parameter或者使用JSON对象等,所以在这篇文章中,我会告诉你关于这些问题的一些技巧。

写文章时,Retrofit的版本是v2.0.0-beta4.

新的group id

第一个你会注意到的改变是新的group id,变成了com.squareup.retrofit2,所以新的依赖声明是:

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'

新的包名

主包名已经改成了

package retrofit2;

这意味的你需要更改所有关于Retrofit的import,此外,如果你还有其他涉及到包名的代码或任务,记得也要更新他们。

proguard 配置

因为新包名,如果你开启了混淆代码,第一件要做的事就是更新配置文件的规则,它们可以在官方网站找到:

-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions

okhttp

okhttp现在Retrofit2内置的默认依赖,实际上,查看Retrofit2的pom文件(maven的依赖配置文件),会发现下面的依赖:

<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId>
</dependency>

如果你不需要用一个特殊版本的okhttp或者其他http client,你不用做任何事情。

生成服务接口实现

service interface implementation generation

你会立即注意到的另外一件事是你的生成服务接口实现的代码没法编译了。

下面是Retrofit的典型代码:

RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint("https://api.github.com").build();
GitHubService service = restAdapter.create(GitHubService.class);

在Retrofit2,会变成:

Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com").build();
GitHubService service = retrofit.create(GitHubService.class);

你可以看到,依然是build模式,但是涉及的方法和类已经变了。

logging

在开发中打印网络请求和返回结果是非常重要的,如果你在Retrofit中启用了这个功能,你会发现实现该功能的方法已经不可用了。

setLogLevel(RestAdapter.LogLevel.FULL)    

那是因为你现在必须依靠okhttp提供的日志系统,HttpLoggingInterceptor.

首先声明一个新的依赖,因为它不是okhttp的一部分所以要另外添加依赖:

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);

ps:其实这个log并不是很好用,最好自己参考源码自己自定义一个,分分钟就搞定了。

gson converter

By default, Retrofit can only deserialize HTTP bodies into OkHttp’s ResponseBody type and it can only accept its RequestBodytype for @Body.

这意味得用来支持其他types的converter必须在创建服务接口时进行设置

为了让JSON和Java对象相互转换,我们需要设置一个GSON转换器

首先,需要一个新的依赖:

compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'

然后设置converter factory:

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

完整的可用converters可以查看官方文档

interceptor

Retrofit另外一个有用的功能是可以拦截http请求进行监控,重写或重试

一个典型应用场景是所有http请求需要加上api key,在Retrofit2之前,可以通过RequestInterceptor实现:

final RequestInterceptor authorizationInterceptor = new RequestInterceptor() {@Overridepublic 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() {@Overridepublic 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);

RxJava observable

如果你正在使用RxJava,你会注意到Retrofit2 interfaces已经不支持Observable了,实际上,Call模式被用于标准的http请求。

当然你可以用你自己的类型,提供你自己的CallAdapter实现,但是幸运的是已经有可用的了,RxJavaCallAdapterFactory.简单说,它把Call转换成Observable.

首先,添加依赖:

com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4

然后,用addCallAdapterFactory进行设置:

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

这篇关于更新到Retrofit2的一些技巧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/873927

相关文章

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

电脑报错cxcore100.dll丢失怎么办? 多种免费修复缺失的cxcore100.dll文件的技巧

《电脑报错cxcore100.dll丢失怎么办?多种免费修复缺失的cxcore100.dll文件的技巧》你是否也遇到过“由于找不到cxcore100.dll,无法继续执行代码,重新安装程序可能会解... 当电脑报错“cxcore100.dll未找到”时,这通常意味着系统无法找到或加载这编程个必要的动态链接库

如何关闭 Mac 触发角功能或设置修饰键? mac电脑防止误触设置技巧

《如何关闭Mac触发角功能或设置修饰键?mac电脑防止误触设置技巧》从Windows换到iOS大半年来,触发角是我觉得值得吹爆的MacBook效率神器,成为一大说服理由,下面我们就来看看mac电... MAC 的「触发角」功能虽然提高了效率,但过于灵敏也让不少用户感到头疼。特别是在关键时刻,一不小心就可能触

前端bug调试的方法技巧及常见错误

《前端bug调试的方法技巧及常见错误》:本文主要介绍编程中常见的报错和Bug,以及调试的重要性,调试的基本流程是通过缩小范围来定位问题,并给出了推测法、删除代码法、console调试和debugg... 目录调试基本流程调试方法排查bug的两大技巧如何看控制台报错前端常见错误取值调用报错资源引入错误解析错误

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常

Apache伪静态(Rewrite).htaccess文件详解与配置技巧

《Apache伪静态(Rewrite).htaccess文件详解与配置技巧》Apache伪静态(Rewrite).htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令,主要的... 一、.htAccess的基本作用.htaccess是一个纯文本文件,它里面存放着Apache服务器

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解