Retrofit 基础实现

2018-08-05  本文已影响0人  一只笔

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


image.png

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<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 的使用

  // 注解里传入 网络请求 的部分URL地址
    // Retrofit把网络请求的URL分成了两部分:一部分放在Retrofit对象里,另一部分放在网络请求接口里
    // 如果接口里的url是一个完整的网址,那么放在Retrofit对象里的URL可以忽略
    // 采用Observable<...>接口
    // getCall()是接受网络请求数据的方法
    @GET("ajax.php?a=fy&f=auto&t=auto&w=hi%20world")
    Observable<Translation> getCall();
  //获取代理对象
    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);
    }
 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'

本文的源码下载地址

上一篇 下一篇

猜你喜欢

热点阅读