RxJava系列实战——RxJava的基本概念
来源:互联网 发布:老师很漂亮知乎 编辑:程序博客网 时间:2024/06/07 17:45
原文链接:http://keye.tk/?p=7
前言
RxJava是当前Android开发者中越来越普及,唯一的问题是在学习的初期比较困难。目前大多数人都习惯用命令行式编程,但是只要你理解它以后,就会觉得她太棒了~
话不多说,让我们开始正文,先放上Github上的链接:
https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxAndroid
响应式编程简介
在正文开始前,我们来说一下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的优势;简洁——随着程序逻辑变得越来越复杂,它依然能够保持简洁高效——快速开发,代码一条从上到下的链式调用,代码结构清晰
观察者模式
1.观察者模式:
RxJava是以一种拓展的观察者模式来实现的,那么我们先来简单的介绍一下,观察者模式:
A对象 (观察者)监听B对象 (被观察者)的某种变化,并瞬间做出反应。
onclick
1
如图所示,通过 setOnClickListener() 方法设置监听(订阅),当用户点击时,Button 自动调用 OnClickListener 的 onClick() 方法,将点击事件传递给OnClickListener 。这就是我们点击事件使用的观察者模式;
2
转化一下,如上图;这就是通用的观察者模式。当Observable(被观察者)与Observer(观察者)达成订阅关系后,被观察者会调用观察者的OnEvent()方法,将事件传递给观察者。
响应式-观察者模式的进阶
1.RxJava的观察者模式:
RxJava使用的就是通用形式的观察者模式;
3
4
普通事件 onNext() (相当于 onClick() / onEvent());
特殊事件:onCompleted() 和 onError()。
如图所示,RxJava的基本概念分别为:Observable(被观察者),Observer(观察者),subscribe (订阅)、事件; 不同的是,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非常的好!”他就好在,可以吧任何复杂的逻辑,简化成一条线一样的代码;方便我们的开发,维护和阅读~!本次文章到这里就结束了,下一篇文章我会讲RxJava的基本实现和api的基本使用。谢谢a
0 0
- RxJava系列实战——RxJava的基本概念
- RxJava系列—(一)RxJava基础
- RxJava—Subject系列
- 急速开发系列——RxJava实战技巧大全
- RxJava系列第一弹——RxJava入门篇
- RxJava系列2(基本概念及使用介绍)
- RxJava系列2(基本概念及使用介绍)
- Android RxJava 实战系列:联合判断
- Android RxJava 实战系列:联想搜索优化
- Android RxJava 实战系列:功能防抖
- RxJava系列之一 初识Rxjava
- RxJava 学习书籍——RxJava Essentials
- RxJava——RxJava应用案例demo
- RxJava入门(基本概念)
- Android架构实战(二)—— RxJava
- RxJava——简介
- Rxjava分析—Subject
- Rxjava分析—Subject
- scribe、chukwa、kafka、flume日志系统对比
- java对cookie的操作
- Expected one of #, input, filter, output at line 2, column 1 (byte 2): Logstash
- 万能适配器Adapter.
- Django中的日期和时间格式 DateTimeField
- RxJava系列实战——RxJava的基本概念
- 苹果开发---window配置苹果虚拟机 和安装xcode
- 说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
- Windows环境下的NodeJS+NPM+Bower安装配置
- 为什么还原sqlserver数据库的状态一直都是正在还原
- 复用 才够酷~~~~
- 阿里云云服务器上安装Apache
- volley获取缓存数据
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划