Android帝国—四大天王

响应式编程。

在之前的分享中我已经分享一期有关响应式编程文章《java 响应式编程》,大家感兴趣可以看一看,其中就用到了RxAndroid 来实现 Java 的响应式编程。

那么为什么会需要响应式编程,今天我们通过一个小例子给大家解释一下。

这里有一个 User 管理类,负责管理用户,提供了更新用户信息的方法。如果都是同步的操作当然没有问题。可以更新一个用户名(setName),或是更新用户年龄。

但是如果我们更新用户信息是将更新提交到服务端,然后更新成功后,再来更新界面,网络请求是不稳定,可以因为网络的问题我们无法更新数据,或者网络状况不好,也会影响我们更新数据的时间。我们可以定义回调函数来处于异步事件,根据返回值来判断是否更新成功。

当然更好的做法我们提供接口来处理异步事件的成功和失败。

还有就是我们有时候会根据实际情况来组合回调函数。我们需要之前请求获取数据作为下一个请求的参数来完成下一次请求。这并不是什么不常见的示例,而是极为常见的示例。

然后我们将获取的用户信息显示在界面上,我们需要在回调函数中更新 UI 界面

由于更新 UI 界面和我们请求网路的线程并不是同一个线程,所以我们还需要返回到 UI 线程来更新界面

除此之外我们还需要考虑现在 textView 是否可用,当选择屏幕时,系统配置更改了,我们是无法获取到 textview。所以我们需要判断一下。

可以 RxAndroid 来重构一下我们的代码,setName 返回一个 Completable 对象,表示我们更新用户姓名的异步事件已经完成,getUser 返回一个 observable 只要我们观察这个可观察的对象,那么只要 User 发生变化了,就会的到通知,不用我们手动获取这个对象。

下面代码解释一下,DisposableObserver 是一种特殊的观察者,这里无需 onSubscribe 回调,我们没有找到这个回调,他的订阅方式也不是传统的 subscribe 而是 subscribeWith.

我们看一看下面的代码,我一步一步解释一下

1. 我们将“提交”按钮包裹在 RxView 中,这样当每次点击此“提交”按钮时,都会触发 doOnNext ,然后我们在回调中禁用“提交”按钮,并启动进度条。这是一次提交开始。

2. 接下来我们通过 flatMap 转移,传递事件,获取输入框的文本,然后将文本作为参数给我们 userManager 的 setName 方法来更新服务端用户名称。setName 成功后会返回一个 complete 对象。

3. 这时回到主线程,隐藏进度条。

4. 就更新用户,关闭进度条,启用提交按钮,失败中做一些相应的处理。

5. 最后把放入可销毁(取消订阅)的 disposable 中。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181028B0ULDC00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券