本文翻译来自–>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的更多相关文章

  1. Android开发学习之路-Android中使用RxJava

    RxJava的核心内容很简单,就是进行异步操作.类似于Handler和AsyncTask的功能,但是在代码结构上不同. RxJava使用了观察者模式和建造者模式中的链式调用(类似于C#的LINQ). ...

  2. [Android]在Dagger 2中使用RxJava来进行异步注入(翻译)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客: # 在Dagger 2中使用RxJava来进行异步注入 > 原文: 几星期前我写了一篇关于在Dagger 2中使用*Producers*进行 ...

  3. Android中使用反应式编程RxJava

    GitHut 地址: https://github.com/ReactiveX/RxAndroid (1)RxJava简介: RxJava 是一个在Java虚拟机上实现的响应式扩展库:提供了基于obs ...

  4. RxJava在Android中使用场景详解

    RxJava 系列文章 <一,RxJava create操作符的用法和源码分析> <二,RxJava map操作符用法详解> <三,RxJava flatMap操作符用法 ...

  5. 给 Android 开发者的 RxJava 详解

    我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个 ...

  6. Android中你应该知道的设计模式

    建造者模式 建造者模式最明显的标志就是Build类,而在Android中最常用的就是Dialog的构建,Notification的构建也是标准的建造者模式. 建造者模式很好理解,如果一个类的构造需要很 ...

  7. android ------- 开发者的 RxJava 详解

    在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github: https://github.com/ReactiveX/RxJava https://github. ...

  8. Android中的设计模式之观察者模式

    参考 <设计模式:可复用面向对象软件的基础 >5.7 Observer 观察者 对象行为型模式 <设计模式解析> 18.4 Observer模式 <Android源码设计 ...

  9. 《Android源代码设计模式解析》读书笔记——Android中你应该知道的设计模式

    断断续续的,<Android源代码设计模式解析>也看了一遍.书中提到了非常多的设计模式.可是有部分在开发中见到的几率非常小,所以掌握不了也没有太大影响. 我认为这本书的最大价值有两点,一个 ...

随机推荐

  1. VeeamBackup9.5-查看和添加备份设备

    备份代理(Backup Proxies)也就是VB主体,是VEEAM的核心组件之一,所有的备份的建立和还原都需要备份代理来完成.VEEAM安装完成后,默认VeeamBackup备份服务器即为备份代理, ...

  2. SSM整合Activiti

    1.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  3. Java并发编程(二)-- 创建、运行线程

    Java线程 Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类. Java可以用如下方式创建一个线程: Tread thread = new Thread ...

  4. JavaScript基础笔记(五) 函数表达式

    函数表达式 一.闭包 概念:闭包是指有权访问另一个函数作用域中变量的函数. function createCompareFun(propertyName) { return function (obj ...

  5. python网络编程(十二)

    协程 协程,又称微线程,纤程.英文名Coroutine. 协程是啥 首先我们得知道协程是啥?协程其实可以认为是比线程更小的执行单元. 为啥说他是一个执行单元,因为他自带CPU上下文.这样只要在合适的时 ...

  6. ORM字段操作

    django orm 建表字段 在django modle 中,我们定义的类,他的对象就是数据库表中的一行数据!!! django orm 基础 一:modle的各个字段: 在python中以code ...

  7. 小甲鱼Python第十三讲课后题--014字符串

     字符串的方法及注释 capitalize()     把字符串的第一个字符改为大写     casefold()     把整个字符串的所有字符改为小写     center(width)      ...

  8. C#轻量级配置文件组件EasyJsonConfig

    一.课程介绍 一.本次分享课程<C#轻量级配置文件EasyJsonConfig>适合人群如下: 1.有一定的NET开发基础. 2.喜欢阿笨的干货分享课程的童鞋们. 二.今天我们要如何优雅解 ...

  9. Java身份证归属地目录树

    数据库结构: web管理界面: 目录树: 视频: 应用场景:

  10. DBS:TestSys

    ylbtech-DBS:TestSys 1.返回顶部 1. -- ============================================= -- 测试系统 -- 2018-4-12 ...