Android开发的又一个方向之 RxJava 详解

Android开发的又一个方向之 RxJava 详解

图片来自极客学院

RxJava是当前Android开发者中越来越普及,唯一的问题是在学习的初期比较困难。目前大多数人都习惯用命令行式编程,但是只要你理解它以后,就会觉得她太棒了~

话不多说,让我们开始正文,先放上Github上的链接:

在正文开始前,我们来说一下RxJava学习中会遇到的一些问题RxJava采用的是响应式编程,它和传统的命令行编程有区别,一些同学一时间无法转变思维,就会在学习和理解上遇到一些困难本篇文章会针对RxJava的响应式编程和传统命令行式编程的区别进行讲解,来帮助初学者更好的理解RxJava的基本概念~

RxJava的概念

1.RxJava的自我介绍:

RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在Java虚拟机上,使用“可观察的序列”构成基于事件的,异步的程序库)。一句话概括了RxJava。

但是对于初学者来说,比较难以理解;简单点说,它是一个实现异步操作的库。我们先这么理解。

2.RxJava 的优势:

讲到异步操作,我们Android中可以用AsyncTask / Handler。。。来实现,为什么还要用RxJava呢?那么来看看RxJava的优势;

  • 简洁——随着程序逻辑变得越来越复杂,它依然能够保持简洁
  • 高效——快速开发,代码一条从上到下的链式调用,代码结构清晰

3.观察者模式

RxJava是以一种拓展的观察者模式来实现的,那么我们先来简单的介绍一下,观察者模式:

A对象 (观察者)监听B对象 (被观察者)的某种变化,并瞬间做出反应。

Android开发的又一个方向之 RxJava 详解

Android开发的又一个方向之 RxJava 详解

如图所示,通过 setOnClickListener() 方法设置监听(订阅),当用户点击时,Button 自动调用 OnClickListener 的 onClick() 方法,将点击事件传递给OnClickListener 。这就是我们点击事件使用的观察者模式;

Android开发的又一个方向之 RxJava 详解

转化一下,如上图;这就是通用的观察者模式。当Observable(被观察者)与Observer(观察者)达成订阅关系后,被观察者会调用观察者的OnEvent()方法,将事件传递给观察者。

响应式-观察者模式的进阶

RxJava使用的就是通用形式的观察者模式:

Android开发的又一个方向之 RxJava 详解
Android开发的又一个方向之 RxJava 详解
  • 普通事件 onNext() (相当于 onClick() / onEvent());
  • 特殊事件:onCompleted() 和 onError()。

如图所示,RxJava的基本概念分别为:Observable(被观察者),Observer(观察者),22subscribe (订阅)、事件; 不同的是,RxJava 把多个事件看做一个队列,并对每个事件单独处理;因此,除了普通的事件,还增加了2个特殊事件。

onCompleted():当队列中没有新的事件产生,也就是所有事件执行完毕,就是调用onCompleted()方法,作为完结的标识;

onError():当事件运行时发生异常,会会调用onError()方法进行异常处理,并且终止队列。

注意:在一个队列中onCompleted() 和 onError(),只有一个会被调用。因为,如果调用了onCompleted()就说明队列执行完毕,没有出现异常,则不会调用onError()方法。相对的,如果队列异常,调用onError()方法的同时会终止队列,队列也就无法完成。

举个栗子(代码演示)

接下来,我们通过代码,来看看RxJava编程和传统命令行编程的区别和优势:

 /**

     * 假设:1.我们有一个Listview,用于显示显示多张图片

     *       2.现在给出一个目录数组,把所有目录中的jpg图片都显示到listview中

     *       3.读取图片是耗时操作,需要在后台运行,listview更新需要在UI线程执行

     *

     * 常规实现方式:

     */

    public void updataImage(final File[] routes, final Context context) {

        new Thread() {

            @Override

            public void run() {

                super.run();

                for (File route : routes) {

                    File[] files = route.listFiles();

                    for (File file : files) {

                        if (file.getName().endsWith(".jpg")) {

                            final Bitmap bitmap = getBitmap(file);

                            ((MainActivity) context).runOnUiThread(new Runnable() {

                                @Override

                                public void run() {

                                    imageList.add(bitmap);

                                    imageListAdatper.notifyDataSetChanged();

                                }

                            });

                        }

                    }

                }

            }

        }.start();

    }

用RxJava是这样实现的:

public void updataImage() {

      Observable.from(routes)

                .flatMap(new Func1<File, Observable>() {

                    @Override

                    public Observable call(File file) {

                        return Observable.from(file.listFiles());

                    }

                })

                .filter(new Func1<File, Boolean>() {

                    @Override

                    public Boolean call(File file) {

                        return file.getName().endsWith(".jpg");

                    }

                })

                .map(new Func1<File, Bitmap>() {

                    @Override

                    public Bitmap call(File file) {

                        return getBitmap(file);

                    }

                })

                .subscribeOn(Schedulers.io())

                .observeOn(AndroidSchedulers.mainThread())

                .subscribe(new Action1() {

                    @Override

                    public void call(Bitmap bitmap) {

                        imageList.add(bitmap);

                        imageListAdatper.notifyDataSetChanged();

                    }

                });

    }

这里可能有人会问了,不是说既优雅又简洁吗?代码怎么变多了。我们从整体结构看一下,你会发现整个代码结构是从上到下,一条链条式的调用,没有嵌套,这个在逻辑的简洁性上有非常大的优势。并且我们的需求越复杂,这种优势越明显。

比如:我们要再限制显示图片的数量,那我们只需要把写好的代码,添加到相应位置,就可以对这个功能进行拓展,所有它的拓展性和可维护性是非常高的。

再比如:我们要维护一个陈年老项目,如果对于传统的方式,我们可能要一层一层代码的理解,遇到迷之嵌套就很难阅读。而如果用RxJava,就可以通过一条链式的阅读,非常快速的掌握代码的逻辑。

讲到这里,可以了解到为什么说“RxJava非常的好!”他就好在,可以吧任何复杂的逻辑,简化成一条线一样的代码;方便我们的开发,维护和阅读~!

目前,我们有很多复杂的APP开始采用响应式编程的方式,下面我们来看一下极客学院的一个使用 RxJava 设计的APP 效果图吧:

Android开发的又一个方向之 RxJava 详解

Android开发的又一个方向之 RxJava 详解

Android开发的又一个方向之 RxJava 详解

如有兴趣,欢迎查看极客学院官网,如果你是一位Android 初学者,想要提升技术,欢迎访问下列链接。

传送门:http://www.jikexueyuan.com/zhiye/course/51.html?type=18

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容