Retorfit+RxJava的简单使用

Posted 高、远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Retorfit+RxJava的简单使用相关的知识,希望对你有一定的参考价值。

【1】背景

这篇文章需要以我的另一篇文章为背景,建议看了另一篇再看这一篇:Retrofit简单使用(小白都会了)
访问聚合数据的天气接口,将返回的数据通过Log打印出来。


【2】使用

Rx+Retorfit 与 Retorfit单独使用有些地方有一些差异。

一、客户端接口的返回类型差异

  • 单独Retorfit:

返回类型一定是retrofit封装好的Call类型

  • Rx+retrofit:

返回类型是Observable类型


二、请求方式差异,以及返回值处理差异

  • 单独retrofit:
<-- 传统方式 ->>
// 1. 创建 网络请求接口 的实例
WeatherService weatherService = RetrofitUtils.getService(WeatherService.class);

// 2. 采用Call<..>接口 对 发送请求 进行封装
Call<Weather> call = weatherService .getInformation();

// 3. 发送网络请求(异步)
call.enqueue(new Callback<JavaBean>() {
    // 请求成功时回调
    @Override
    public void onResponse(Call<JavaBean> call, Response<JavaBean> response) {
         ...  
    }

    // 请求失败时回调
    @Override
    public void onFailure(Call<JavaBean> call, Throwable throwable) {
        ....
    }
});

  • Rx+retrofit:
<-- RxJava 版方式 ->>
// 1. 创建 网络请求接口 的实例
WeatherService weatherService = RetrofitUtils.getService(WeatherService.class);

// 2. 采用Observable<...>形式 对 网络请求 进行封装
Observable<Weather> observable= weatherService .getInformation();

// 3. 发送网络请求(异步)
observable.subscribeOn(Schedulers.io())               // 在IO线程进行网络请求
          .observeOn(androidSchedulers.mainThread())  // 回到主线程 处理请求结果
          .subscribe(new Observer<JavaBean>() {

            // 发送请求后调用该复写方法(无论请求成功与否)
            @Override
            public void onSubscribe(Disposable d) {
                ...// 初始化工作
              }
            
            // 发送请求成功后调用该复写方法
            @Override
            public void onNext(JavaBean result) {
                ...// 对返回结果JavaBean类对象 进行处理
            }

            // 发送请求成功后,先调用onNext()再调用该复写方法
            @Override
            public void onComplete() {
                Log.d(TAG, "请求成功");
            }
            // 发送请求失败后调用该复写方法
            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "请求失败");
            }

        });
}



【3】demo演示

  1. 工具类:获取retrofit和Service对象方法:
  2. javabean接收返回数据的模板:
  3. 客户端接口:
  4. MainActivity中使用:
private void funcRx() {
        load.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String tempAddress = address.getText().toString();
                if(!tempAddress.equals("")){
                    RetrofitUtils.getService(WeatherService.class).getInformation2(tempAddress,"bef419514fbcb7fd59bd4e43b655b81b")
                            //给上面的耗时操作分配io线程

                            .subscribeOn(Schedulers.io())
                            //将下面的操作分配到主线程中
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe(new Observer<Weather>() {
                                @Override
                                public void onSubscribe(@org.jetbrains.annotations.NotNull Disposable d) {
                                    Log.e("test","111");
                                }

                                @Override
                                public void onNext(@org.jetbrains.annotations.NotNull Weather weather) {
                                    Log.e("test",weather.toString());
                                }

                                @Override
                                public void onError(@org.jetbrains.annotations.NotNull Throwable e) {
                                    Log.e("test","访问出错");
                                }

                                @Override
                                public void onComplete() {
                                    Log.e("test","访问完成");
                                }
                            });
                }else {
                    Toast.makeText(MainActivity.this,"城市不能为空!",Toast.LENGTH_LONG).show();
                }
            }
        });
    }
  1. 项目结构:

  2. 运行结果:

以上是关于Retorfit+RxJava的简单使用的主要内容,如果未能解决你的问题,请参考以下文章

如何取消订阅RxKotlin / RxJava中的Flowable?

协程 | Retorfit + 协程机制 + MVVM

使用 rxJava 和改造多次调用另一个请求中的请求

使用 RxJava 将数据从 ViewModel 移动到 Fragment

如何使用 retorfit2 创建用于解析 Json 的通用模型类?

从 recyclerview 的适配器访问父片段方法