我们为什么要在Android中使用RxJava
本文翻译来自–>Why should we use RxJava on Android
另外: 微凉一季
再另外: 微凉一季
感觉RxJava近期风生水起,不学习一下都不好意思了。洒家也是初学RxJava,也是感觉代码好像更复杂更难懂了。看了一篇外文感同身受,简单翻译一下。本文简介使用RxJava优势所在。但可能须要有一点RxJava基础,推荐先看一下抛物线的那篇经典的匠心写作。
—–华丽切割线。译文開始———
Reactive Extensions (Rx) 是一系列接口和方法。为开发人员提供了一种易懂且迅速简单易维护的方法。
RxJava就是干这事儿的,提供一系列tools来帮你写出简洁的代码。
老实说,一開始我觉得RxJava 写的代码理解起来非常困难。而且引入一个库,单单就是为了用用这样的新式的api,这困扰到了我。后来。我懂了。以传统的编码方式。随着app的发展,我须要重构代码、一遍一遍的反复样板代码。以满足用户不断变更的新需求,这让我苦不堪言。
我做的大量工作,事实上是改写相关方法和接口,就是由于需求的变更(这是开发与产品间那些血案的原罪)或者须要改变展示的信息亦或是须要改变处理信息数据..这非常抓狂。
另外。这样的代码让其它来维护的人来理解,一般是非常耗时的。
举个栗子:我们须要从数据库获取一组用户的链表数据,并展示出来。我们能够用AsyncTask后台查询数据库,获得的结果给Ui的适配器展示出来。简单演示样例代码:
public class SampleTask extends AsyncTask<Void,Void,List<Users>> {
private final SampleAdapter mAdapter;
public SampleTask(SampleAdapter sampleAdapter) {
mAdapter = sampleAdapater;
}
@Override
protected List<Users> doInBackground(Void... voids) {
//fetch there results from the database and return them to the onPostExecute
List<Users> users = getUsersFromDatabase();
return users;
}
@Override
protected void onPostExecute(List<Users> users) {
super.onPostExecute(products);
// Checking if there are users on the database
if(users == null) {
//No users, presenting a view saying there are no users
showEmptyUsersMessageView();
return;
}
for(User user : users){
mAdapter.add(user);
}
mAdapter.notifyDataSetChanged();
}
}
如今有个新需求,要求仅仅显示非guest的user,我们处理的方法是,在加入到adapter前加个条件推断是不是guset,或者改变数据库查询的条件。
更有甚者。你又被要求从数据库中获取另外的其它信息。跟user一并在这个adapter中显示出来呢?
这就是我们为什么要用RxJava了,把我们从这个泥潭中拉出来。换个姿势。我们Rx代码是这样子(如果您已学习过Rx基础使用方法):
public Observable<List<User>> fetchUsersFromDatabase() {
return Observable.create(new Observable.OnSubscribe<List<User>(){
@Override
public void call(Subscriber<?
super List<User>> subscriber){
// Fetch information from database
subscriber.onNext(getUserList());
subscriber.onCompleted();
}
});
}
像这样被调用:
fetchUsersFromDatabase()
.subscribeOn(Schedulers.io())
//will process everything in a new thread
.observeOn(AndroidSchedulers.mainThread())
//will listen the results on the main thread
.subscribe(new Subscriber<List<User>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List<User> users) {
//Do whatever you want with each user
}
});
開始改需求了哈
怎么不显示guests呢。RxJava分分钟过滤掉这样的不速之客:
fetchUsersFromDatabase()
.filter(new Func1<User, Boolean>() {
@Override
public Boolean call(User user) {
//only return the users which are not guests
return !user.isGuest();
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<User>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
/*Check if there was any error while retrieving from database*/
}
@Override
public void onNext(User user) {
//Do whatever you want with each user
}
}
);
传统的方式,即便是个简单的变更。为了保持优雅的接口化编程,我们也得创建新接口,重构代码来实现过滤。
可是使用RxJava让这一切变得优雅了,我们仅仅须要一个被观察者用来获取全部的信息,让后你就能够尽情的用这些方法来过滤获取你想要的数据。
可能你又会说了。ok,这是非常好非常易读的结构。可是这似乎使代码量变多了呢。well you are right,可是这就是Retrolambda闪耀的时候了,这个库为我们兼容了以使用java8 lambda表达式,方法引用等等。
帮我们简化代码例如以下:
fetchUsersFromDatabase()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(value -> {
//Do whatever with the value
},error -> {
//do something with in case of error
}
);
这个问题完美搞定,然后你又開始问了,我须要添加另外的查询结果和user一同显示在这个adapter中怎么破。这真不是事儿:
fetchUsersFromDatabase()
.zipWith(fetchSomethingElseFromDatabase(), (users, somethingElse) -> {
/*here combine users and something else into a new object*/
})
.subscribe( o -> {
/*use the combine object from users and something else to fill the adapter */
});
如上,我们能够轻松组合数据库查出来的其它数据和users给一个adapter一同显示。是不是更易维护。代码少。易读,清晰?
如果要更深入的学习RXJava能够看以下这篇文章,我看后受益匪浅。
[Party tricks with RxJava, RxAndroid & Retrolambda](https://medium.com/p/1b06ed7cd29c)
另外,这篇教程[tutorial ](https://gist.github.com/staltz/868e7e9bc2a7b8c1f754) 也帮我在RxJava路上进阶了非常多。
我们为什么要在Android中使用RxJava的更多相关文章
- Android开发学习之路-Android中使用RxJava
RxJava的核心内容很简单,就是进行异步操作.类似于Handler和AsyncTask的功能,但是在代码结构上不同. RxJava使用了观察者模式和建造者模式中的链式调用(类似于C#的LINQ). ...
- [Android]在Dagger 2中使用RxJava来进行异步注入(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客: # 在Dagger 2中使用RxJava来进行异步注入 > 原文: 几星期前我写了一篇关于在Dagger 2中使用*Producers*进行 ...
- Android中使用反应式编程RxJava
GitHut 地址: https://github.com/ReactiveX/RxAndroid (1)RxJava简介: RxJava 是一个在Java虚拟机上实现的响应式扩展库:提供了基于obs ...
- RxJava在Android中使用场景详解
RxJava 系列文章 <一,RxJava create操作符的用法和源码分析> <二,RxJava map操作符用法详解> <三,RxJava flatMap操作符用法 ...
- 给 Android 开发者的 RxJava 详解
我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个 ...
- Android中你应该知道的设计模式
建造者模式 建造者模式最明显的标志就是Build类,而在Android中最常用的就是Dialog的构建,Notification的构建也是标准的建造者模式. 建造者模式很好理解,如果一个类的构造需要很 ...
- android ------- 开发者的 RxJava 详解
在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github: https://github.com/ReactiveX/RxJava https://github. ...
- Android中的设计模式之观察者模式
参考 <设计模式:可复用面向对象软件的基础 >5.7 Observer 观察者 对象行为型模式 <设计模式解析> 18.4 Observer模式 <Android源码设计 ...
- 《Android源代码设计模式解析》读书笔记——Android中你应该知道的设计模式
断断续续的,<Android源代码设计模式解析>也看了一遍.书中提到了非常多的设计模式.可是有部分在开发中见到的几率非常小,所以掌握不了也没有太大影响. 我认为这本书的最大价值有两点,一个 ...
随机推荐
- 潭州课堂25班:Ph201805201 第一课:环境搭建 (课堂笔记)
安装PyCharm ,Oracle VM VirtualBox,Xshell ,实现仿真远程连接服务器,其中Oracle VM VirtualBox用于那家linux服务器,Xshell 用于连接服务 ...
- 一步一步教你从零开始写C语言链表---构建一个链表
版权声明:本文为博主原创文章,如有需要,请注明转载地址:http://blog.csdn.net/morixinguan.若是侵权用于商业用途,请联系博主,否则将追究责任 https://blog ...
- JS引用类型之Array
ECMAScript中的数组可以说是比较神奇了, ECMAScript中定义的数组每一项可以保存不同的数据类型,如第一项为字符串,第二项为数值等等 1. 那怎么创建一个数组呢? 方法和创建对象实例类似 ...
- Eclipse 安装Maven插件m2eclipse
Eclipse->Help->Install New Software->Work with右边Add按钮->Name字段中输入m2e,Location字段中输入http:// ...
- 深入理解JVM(8)——类加载的时机
一.类的生命周期 一个类从加载进内存到卸载出内存一共要经历7个阶段:加载—>验证—>准备-->解析—>初始化—>使用—>卸载. 类加载包括五部分:加载—>验证 ...
- Charles抓包(未完待续)
Charles是在 Mac 下常用的网络封包截取工具,在做移动开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析. Charles 通过将自己设置成系统的网络访问代理服务器,使得 ...
- JAVA的基本数据类型和类型转换
一.数据类型 java是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值称为变量的初始化. java数据类型分为基本数据类型和引用数据类型 基本数据类型有4类8种 第一类(有4种)整型: ...
- poj3061 Subsequence(尺取法)
https://vjudge.net/problem/POJ-3061 尺取发,s和t不断推进的算法.因为每一轮s都推进1所以复杂度为O(n) #include<iostream> #in ...
- Scala编程基础
Scala与Java的关系... 4 安装Scala. 4 Scala解释器的使用... 4 声明变量... 5 数据类型与操作符... 5 函数调用与apply()函数... 5 if表达式... ...
- iOS:类似于网易云音乐的刷新条目显示弹框
一.介绍 在app中使用刷新控件或者第三方刷新库是最常见的功能,在请求服务器时,获取数据的过程是处于不可见状态的,那么通过这个刷新状态可以给用户以直观的感受,这是增强用户体验的一个相当好的方法.我个人 ...