Retrofit|Retrofit 基础实现

Retrofit, 其实是对okhttp一个封闭,它本身不做网络请求,只是生成请求的对象。

Retrofit|Retrofit 基础实现
文章图片
image.png retrofit 扩展

  • OkHttpClient:Retrofit使用OkHttpClient来实现网络请求,这个OkHttpClient虽然不能替换成其他网络执行框架,比如Volley,但是对他进行扩展,最简单的就是使用它的Interceptor拦截器。
  • addConverterFactory:对返回数据类型的自动转换。
  • addCallAdapterFactory:对网络工作对象callWorker的自动转换。把Retrofit中执行的网络请求的Call对象,转换为接口定义的Call对象。
Retrofit实现原理-函数解析、网络请求、数据转换 Retrofit|Retrofit 基础实现
文章图片
image.png 根据接口定义解析函数,得到函数的具体定义,生成对应的ServiceMethod。然后根据这个ServiceMethod,实现一个OkHttpClient的Call对象,负责在Retrofit底层实现网络访问。其中在网络访问返回网络数据,根据ServiceMethod实现数据转换。最后利用适配器,把OkHttpCall对象转换为接口要求的Call网络请求对象
Retrofit 使用流程
  1. 通过接口来描述请求的行为与请求参数
  2. 创建Retrofit实例
  3. 创建一个代理对象
  4. 接口调用
  5. 执行与回调
//通过接口来描述请求的行为与请求参数 @POST("ajax.php?a=fy&f=auto&t=auto&w=hi%20world") Call 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 call = request.request(); //执行与回调 call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { try { if (response != null) { System.out.println(response.body()); } } catch (Exception e) { e.printStackTrace(); } }@Override public void onFailure(Call 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 getCall();

  • 创建Retrofit
//获取代理对象 private T getPoxy(Class 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 observable = service.getCall(); //设置订阅 observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) {}@Override public void onNext(Translation translation) { translation.show(); }@Override public void onError(Throwable e) {}@Override public void onComplete() {} }); }

【Retrofit|Retrofit 基础实现】选择的结果:

Retrofit|Retrofit 基础实现
文章图片
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'

本文的源码下载地址

    推荐阅读