我们为什么要在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路上进阶了非常多。

时间: 2024-10-20 05:36:01

我们为什么要在Android中使用RxJava的相关文章

RxJava入门系列四,Android中的响应式编程

RxJava入门系列四,Android中的响应式编程 在入门系列1,2,3中,我基本介绍了RxJava是如何使用的.但是作为一名Android开发人员,你怎么让RxJava能为你所用呢?这篇博客我将针对Android开发来介绍一下RxJava的使用场景. RxAndroid RxAndroid是为Android打造的RxJava扩展.通过RxAndroid可以让你的Android开发变得更轻松. 首先,RxAndroid中提供了AndroidSchedulers,你可以用它来切换Android线

深入浅出RxJava四-在Android中使用响应式编程

原文链接 在第1,2,3篇中,我大概介绍了RxJava是怎么使用的.下面我会介绍如何在Android中使用RxJava. RxAndroid RxAndroid是RxJava的一个针对Android平台的扩展.它包含了一些能够简化Android开发的工具. 首先,AndroidSchedulers提供了针对Android的线程系统的调度器.需要在UI线程中运行某些代码?很简单,只需要使用AndroidSchedulers.mainThread(): myImageView.setImageBit

Android编程:双工tcp客户端中应用RxJava

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN10 开发环境:Android Studio 2.2 Preview 3 RxJava版本:2.0.1 RxAndroid版本:2.0.1 说明: 在<Android编程:双工tcp客户端>文中用双线程处理了tcp客户端的发送和接收.现在用RxJava对此客户端代码进行优化: 用RxJava创建连接,替代之前的创建连接线程 用RxJava断开连接,替代之前的断开连接线程 用RxJ

给 Android 开发者的 RxJava 详解

作者:扔物线 前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个月,我也发现国内越来越多的人开始提及 RxJava .有人说『RxJava 真是太好用了』,有人说『RxJava 真是太难用了』,另外更多的人表示:我真的百度了也谷歌了,但我还是想问: RxJava 到底是什么? 鉴于 RxJava 目前这种既火爆又神秘的现状,而我又在一年的使用

Android 基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器aaa

MDPlayer万能播放器 MDPlayer,基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器,可以播放本地和在线视频,可以浏览宅男杀手妹纸图片,UI设计遵循 Material Design. GitHub地址:https://github.com/Dawish/MDPlayer UI浏览:         1.UI设计: 列表使用RecyclerView,item为CardView并设置rippl

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

建造者模式 建造者模式最明显的标志就是Build类,而在Android中最常用的就是Dialog的构建,Notification的构建也是标准的建造者模式. 建造者模式很好理解,如果一个类的构造需要很多参数,而且这些参数并不都是必须的,那么这种情况下就比较适合Builder. 比如构建一个AlertDialog,标题.内容.取消按钮.确定按钮.中立按钮,你可能只需要单独设置几个属性即可:另外在我的OkHttpPlus项目中,构造一个Http请求也是这样的,有可能你只需要设置URL,有可能需要添加

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

断断续续的,<Android源码设计模式解析>也看了一遍,书中提到了很多的设计模式,但是有部分在开发中见到的几率很小,所以掌握不了也没有太大影响. 我觉得这本书的最大价值有两点,一个是从设计模式的角度去理解Android源码,结合着日常开发中的常用类,对设计模式的理解会更加的深刻:另外一个好处就是了解常用模式,再看其他人写的代码的时候,更容易理解代码思路.下面是我的读书笔记和一些思考,设计模式只整理我认为重要的部分. 建造者模式 建造者模式最明显的标志就是Build类,而在Android中最常

转:给 Android 开发者的 RxJava 详解

转自:  http://gank.io/post/560e15be2dca930e00da1083 评注:多图解析,但是我还是未看懂. 前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个月,我也发现国内越来越多的人开始提及 RxJava .有人说『RxJava 真是太好用了』,有人说『RxJava 真是太难用了』,另外更多的人表示:我真的百度

【译】Android中构建快速可靠的UI测试

博客原地址:Android中构建快速可靠的UI测试 译文原链接:Fast and reliable UI tests on Android 翻译:Anthony 译者注:如果你关注android架构,那么你肯定之前看过小鄧子翻译的这篇文章Android应用架构.本篇文章的正是其原作者Iván Carballo的又一篇经典之作.也推荐你关注github项目Android架构合集以及我的从零开始搭建android框架系列文章 前言 让我一起来看看 Iván Carballo和他的团队是如何使用Esp