Retrofit是什么?
简介
Retrofit,中文的翻译为“式样翻新”的意思,是一个基于OKHttp的RESTful网络请求框架。通俗一点来说,Retrofit就是一个网络请求框架的封装。同样是由Square公司开源的Android热门网络框架之一,其具有功能强大、简洁易用及高可拓展性特点。
官网网址:(http://square.github.io/retrofit/)
Github地址:(https://github.com/square/retrofit)
特点
1、基于OkHttp并遵循Restful API设计风格
2、通过注解的形式,可简便的配置网络请求参数
3、支持同步及异步的网络请求方式
4、支持RxJava
5、支持多种数据格式的解析(Json、XML、Protobuf等)
Retrofit怎么用?
1、gradle引入库
implementation 'com.squareup.retrofit2:retrofit:2.4.0'implementation 'com.squareup.retrofit2:converter-gson:2.4.0' //配置使用Gson解析响应数据 可选implementation 'com.squareup.retrofit2:adapter-rxjava:2.4.0' //配置支持RxJava 可选
2、初始化Retrofit对象
Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) //配置baseUrl .addConverterFactory(GsonConverterFactory.create()) //配置使用Gson解析响应数据 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) //配置支持RxJava .build();
public interface WeatherService {
//使用GET请求 直接返回原始数据 @GET("weather?location=%E5%98%89%E5%85%B4&output=json&ak=5slgyqGDENN7Sy7pw29IUvrZ") Call cityNameQueryWeather(); //使用GET请求 返回Json映射对象 @GET("{weather}?location=%E5%98%89%E5%85%B4&output=json") Call cityWeatherPath(@Path("weather") String weather, @Query("ak") String ak); //使用POST请求 支持RxJava返回 @FormUrlEncoded() @POST("{weather}") rx.Observable cityWeatherPost(@Path("weather") String weather, @Field("ak") String ak, @Field("location") String location, @Field("output") String output); }
同步请求
WeatherService weatherService = retrofit.create(WeatherService.class); Call responseBodyCall = weatherService.cityNameQueryWeather(); try {
Response responseBody = responseBodyCall.execute(); System.out.println("call:" + responseBody.body().string()); } catch (IOException e) {
e.printStackTrace(); }
异步请求
WeatherService weatherService = retrofit.create(WeatherService.class); Call responseBodyCall = weatherService.cityWeatherPath("weather", "5slgyqGDENN7Sy7pw29IUvrZ"); responseBodyCall.enqueue(new Callback() {
@Override public void onResponse(Call call, Response response) {
System.out.println("call:" + response.toString()); } @Override public void onFailure(Call call, Throwable t) {
} })
RxJava支持
WeatherService weatherService = retrofit.create(WeatherService.class); weatherService.rxCityWeatherPost("weather", "5slgyqGDENN7Sy7pw29IUvrZ", "%E5%98%89%E5%85%B4", "json") .subscribeOn(Schedulers.io()) //在新线程里面处理网络请求 .observeOn(AndroidSchedulers.mainThread()) //在主线程里面接受返回的数据 .subscribe(new rx.Observer() {
@Override public void onCompleted() {
} @Override public void onError(Throwable e) {
} @Override public void onNext(WeatherResp weatherResp) {
System.out.println("call:" + weatherResp.toString()); } });
详细的Retrofit的注解配置及各注解的使用,推荐参考
这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)
(https://blog.csdn.net/carson_ho/article/details/73732076)
Retrofit核心执行流程是怎样?
关键类功能说明
类 | 功能说明 |
---|---|
Retrofit | 里面包含了很多对象,serviceMethodCache(自定义的接口映射对象集合)、baseUrl(请求地址)、callFactory(默认为OKHttpCall)、converterFactories(数据解析器工厂集合)、callAdapterFactories(Call适配器工厂集合)、callbackExecutor(回调执行,Android平台默认为MainThreadExecutor)使用Builder模型构建 |
Platform | Retrofit中用来管理多平台的方法,支持Android、Java8。通过findPlatform获取对应的平台,同时也初始化了defaultCallAdapterFactory工厂 |
ServiceMethod | 接口映射的网络请求对象,通过动态代理,将自定义接口的标注转换为该对象,将标注及参数生成OkHttp所需的Request对象。Retrofit的create通过动态代理拦截,将每一个自定义接口转换成为一个ServiceMethod对象,并通过通过serviceMethodCache进行缓存。 |
Call | Retrofit定义的网络请求接口,包含execute、enqueue等方法 |
OkHttpCall | Ohttp的Call实现,通过createRawCall得到真正的 okhttp3.Call对象,用于进行实际的网络请求 |
CallAdapter.Factory | CallAdapter的静态工厂,包含get的抽象方法,用于生产CallAdapter对象 |
ExecutorCallAdapterFactory | Android平台默认的CallAdapter工厂,get方法使用匿名内部类实现CallAdapter,返回ExecutorCallbackCall,实现了Call |
ExecutorCallbackCall | 采用静态代理设计,delegate实际为OkHttpCall,使用callbackExecutor实现回调在主线程中执行 |
RxJavaCallAdapterFactory | Rxjava平台的CallAdapter工厂,get方法返回RxJavaCallAdapter对象 |
RxJavaCallAdapter | Rxjava平台的设配器,返回observable对象 |
Converter.Factory | 数据解析器工厂,用于生产Converter实例 |
GsonConverterFactory | 数据解析工厂实例,返回了GsonResponseBodyConverter数据解析器 |
GsonResponseBodyConverter | Gson的数据解析器,将服务端返回的json对象转换成对应的java模型 |
Response | Retrofit网络请求响应的Response |