使用RxJava来改进用户体验
2016-01-29 10:25
323 查看
编辑推荐:稀土掘金,这是一个高质量的技术干货分享社区,web前端、Android、iOS、设计资源和产品,满足你的学习欲望。
一个完美的移动世界永远不会失去连接,而服务端也永远不会返回错误。
构建一个很棒的app对于用户来说是幸福的事而对于开发者来说则是痛苦的事。用户点击一个按钮就阻塞了所有操作的时代已经过去了,那是要死人的。
让我们来创建一个更好的文本框搜索功能并关注以下需求
尽可能少的请求
对用户尽可能少的错误信息
RX 的逻辑相当简单,重点在完善细微的细节上。
让我们从简单的逻辑开始:
当用户输入内容的时候我们发出了一个网络请求然后获得结果:
每输入一个字母(对的这很坑)比如:用户快速输入了一个“a”,然后“ab”然后“abc”然后又纠正为“ab”并最终想搜索“abe”。这样你就做了5次网络请求。想象一在网速很慢的时候是个什么情况。
你还面临一个线程赛跑的问题。比如:用户输入了“a”,然后是“ab”。“ab”的网络调用发生在前而”a“的调用发生在后。那样的话updateList() 将根据 “a”的请求结果来执行。
0+300ms时搜索“abcd”,但是“ab”的网络调用需要 150ms以上的时间才能完成,那么到了开始“abcd”调用的时候前面的那个会被取消。这样你总是能得到最近的请求数据。
如果所有的网络调用都失败,那么你将不能再次观察到text的改变。
这可以通过添加 error catching functionality来解决。
因此你可以用:
Don’t do that. Let’s make it smarter. What if the searchItems() api call above calls because of connectivity? Or even more “UX-depressingly” brief connectivity that the user didn’t notice?
别这么做。让我们让它更智能些。要是 searchItems() api调用因为网络连接的问题发生在其它调用之前呢?
你需要这样的一个重试机制:
如何进一步改进呢?添加一个超时(timeout)。就如我们的用户体验设计师 Leander Lenzing 所说的:“1秒对于用户来说是一个很长的时间”。所以上面的代码应该这样:
那么RetryWithConnectivityIncremental 和RetryWithConnectivity 会做些什么呢?它将等待5秒让手机网络畅通,如果超过则会抛出一个异常。如果用户重试它则会等待更长的超时时间(比如15秒)。
这里是代码:
BroadcastObservable.java hosted with ❤ by GitHub
RetryWithConnectivityIncremental.java hosted with ❤ by GitHub
以上。你节制了你的请求,你总是能得到最近的请求结果,你有重试连接的智能超时处理机制。
英文原文:Improving UX with RxJava
一个完美的移动世界永远不会失去连接,而服务端也永远不会返回错误。
构建一个很棒的app对于用户来说是幸福的事而对于开发者来说则是痛苦的事。用户点击一个按钮就阻塞了所有操作的时代已经过去了,那是要死人的。
让我们来创建一个更好的文本框搜索功能并关注以下需求
尽可能少的请求
对用户尽可能少的错误信息
RX 的逻辑相当简单,重点在完善细微的细节上。
让我们从简单的逻辑开始:
当用户输入内容的时候我们发出了一个网络请求然后获得结果:
减少网络请求
以上存在两个问题:每输入一个字母(对的这很坑)比如:用户快速输入了一个“a”,然后“ab”然后“abc”然后又纠正为“ab”并最终想搜索“abe”。这样你就做了5次网络请求。想象一在网速很慢的时候是个什么情况。
你还面临一个线程赛跑的问题。比如:用户输入了“a”,然后是“ab”。“ab”的网络调用发生在前而”a“的调用发生在后。那样的话updateList() 将根据 “a”的请求结果来执行。
解决:
添加调节行为:
你需要的是debounce() 。根据我的经验,取值在100–150毫秒效果最好。如果你的服务器需要额外的300毫秒那么你可以在0.5秒之内做UI更新。杀死前面的请求:
引入 switchMap来替代flatMap。它会停止前面发出的items。所以如果在0+150ms时你搜索“ab”,在0+300ms时搜索“abcd”,但是“ab”的网络调用需要 150ms以上的时间才能完成,那么到了开始“abcd”调用的时候前面的那个会被取消。这样你总是能得到最近的请求数据。
2. No error functionality / no network functionality
如果所有的网络调用都失败,那么你将不能再次观察到text的改变。这可以通过添加 error catching functionality来解决。
因此你可以用:
别这么做。让我们让它更智能些。要是 searchItems() api调用因为网络连接的问题发生在其它调用之前呢?
你需要这样的一个重试机制:
这里是代码:
BroadcastObservable.java hosted with ❤ by GitHub
以上。你节制了你的请求,你总是能得到最近的请求结果,你有重试连接的智能超时处理机制。
英文原文:Improving UX with RxJava
相关文章推荐
- myeclipse快捷操作学习
- JAVA写个东西读取TXT中的数据 且要计算出平均值和总值 最后还要按总值排序
- Java关键字之final详解
- charter 2-java对象和类
- java模拟实现生产者---消费者问题
- JAVA的BIT数组
- 通过密码 加密解密算法,java
- java成神之路
- JAVA笔记——将excel解析为对象(通用模板)
- java生成二维码 并调用二维码打印机
- 重新温习java基础(1)
- 更新整理本人全部博文中提供的代码与工具(Java,2014.09)
- SpringMVC环境搭建 配置文件_2
- Maven下载依赖项的源代码(source code)和Javadoc
- Spring读写xml文件
- 解决NetBeans 8.x的字体问题
- RxStore_一个使用RxJava的轻量级的数据持久化框架(二)
- 无IDE时编译和运行Java
- 在java项目中使用AES256 CBC加密
- Spring4 与 Hibernate4 整合过程中的问题记录