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. 运行结果:
    在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值