Retrofit 基础实现

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


Retrofit 基础实现_第1张图片
image.png

retrofit 扩展

  • OkHttpClient:Retrofit使用OkHttpClient来实现网络请求,这个OkHttpClient虽然不能替换成其他网络执行框架,比如Volley,但是对他进行扩展,最简单的就是使用它的Interceptor拦截器。
  • addConverterFactory:对返回数据类型的自动转换。
  • addCallAdapterFactory:对网络工作对象callWorker的自动转换。把Retrofit中执行的网络请求的Call对象,转换为接口定义的Call对象。

Retrofit实现原理-函数解析、网络请求、数据转换

Retrofit 基础实现_第2张图片
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 基础实现_第3张图片
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'

本文的源码下载地址

你可能感兴趣的:(Retrofit 基础实现)