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演示
- 工具类:获取retrofit和Service对象方法:
- javabean接收返回数据的模板:
- 客户端接口:
- 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();
}
}
});
}
-
项目结构:
-
运行结果:
以上是关于Retorfit+RxJava的简单使用的主要内容,如果未能解决你的问题,请参考以下文章
如何取消订阅RxKotlin / RxJava中的Flowable?
使用 RxJava 将数据从 ViewModel 移动到 Fragment