Retrofit, 其实是对okhttp一个封闭,它本身不做网络请求,只是生成请求的对象。
image.png
retrofit 扩展
- OkHttpClient:Retrofit使用OkHttpClient来实现网络请求,这个OkHttpClient虽然不能替换成其他网络执行框架,比如Volley,但是对他进行扩展,最简单的就是使用它的Interceptor拦截器。
- addConverterFactory:对返回数据类型的自动转换。
- addCallAdapterFactory:对网络工作对象callWorker的自动转换。把Retrofit中执行的网络请求的Call对象,转换为接口定义的Call对象。
Retrofit实现原理-函数解析、网络请求、数据转换
image.png根据接口定义解析函数,得到函数的具体定义,生成对应的ServiceMethod。然后根据这个ServiceMethod,实现一个OkHttpClient的Call对象,负责在Retrofit底层实现网络访问。其中在网络访问返回网络数据,根据ServiceMethod实现数据转换。最后利用适配器,把OkHttpCall对象转换为接口要求的Call网络请求对象
Retrofit 使用流程
- 通过接口来描述请求的行为与请求参数
- 创建Retrofit实例
- 创建一个代理对象
- 接口调用
- 执行与回调
//通过接口来描述请求的行为与请求参数
@POST("ajax.php?a=fy&f=auto&t=auto&w=hi%20world")
Call<Translation> request();
//创建Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://fy.iciba.com/")
.addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 支持RxJava
.build();
//创建一个代理对象
GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);
//接口调用
Call<Translation> call = request.request();
//执行与回调
call.enqueue(new Callback<Translation>() {
@Override
public void onResponse(Call<Translation> call, Response<Translation> response) {
try {
if (response != null) {
System.out.println(response.body());
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<Translation> call, Throwable throwable) {
throwable.printStackTrace();
}
});
Retrofit 接合RxJava 的使用
- 创建接口,注意这里返回的是RxJava Observable对象
// 注解里传入 网络请求 的部分URL地址
// Retrofit把网络请求的URL分成了两部分:一部分放在Retrofit对象里,另一部分放在网络请求接口里
// 如果接口里的url是一个完整的网址,那么放在Retrofit对象里的URL可以忽略
// 采用Observable<...>接口
// getCall()是接受网络请求数据的方法
@GET("ajax.php?a=fy&f=auto&t=auto&w=hi%20world")
Observable<Translation> getCall();
- 创建Retrofit
//获取代理对象
private <T> T getPoxy(Class<T> tClass) {
//创建Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://fy.iciba.com/")
.addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 支持RxJava
.build();
//创建一个代理对象
return retrofit.create(tClass);
}
- 执行与回调,通过返回的Observable 设置订阅
public void test2() {
//获取服务的代理
GetRequest_Interface service = getPoxy(GetRequest_Interface.class);
//返回的是RxJava Observable 对象
Observable<Translation> observable = service.getCall();
//设置订阅
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Translation>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Translation translation) {
translation.show();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
选择的结果:
image.png
添加的依赖:
// Android 支持 Rxjava
implementation 'io.reactivex.rxjava2:rxjava:2.1.3'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
// Android 支持 Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
// 衔接 Retrofit & RxJava
implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
// 支持Gson解析
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
网友评论