对rxandroid的简单理解
最近发现这个rxandroid挺火的,我就研究了一下,还真的挺不错。
首先在说之前可能很多人会和我刚刚学习的时候一样有很多疑问,如:
1:rxandroid是什么东西?
2:rxandroid能干嘛?
3:rxandroid为什么有着么多人用?
4:rxandroid怎样用?
什么是rxandroid呢?
也许很多人奇怪,android前面前面多了个rx?是个什么东西,兄弟,不要急。rx说的简单一点就是响应式编程的意思。rxandroid是在rxJava拓展而来的。当然既然有rxjava,那也有其他的(rxJs,rxswift)等等。因为android就是用java语言写的,所以区别并不是有多大。我们知道在 android中,主线程是不能做耗时操作,否则容易造成线程阻塞,而子线程是不能更新ui的,如果强制这样做的话,就会抛异常。为了解决这些问题,android提供了AsyncTask、Handler等等。嗯,好像说了这么多,rxjava是什么东西呢?简单一点的说,rxjava就是一个解决异步的框架,对,就是这样理解就行了。
rxandroid能干嘛?
前面我们说过android中,主线程是不能做耗时操作,否则容易造成线程阻塞,而子线程是不能更新ui的,如果强制这样做的话,就会抛异常。为了解决这些问题,android提供了AsyncTask、Handler,有人说了,android已经提供了,还要这个有什么用,我看了很多人博客,我很喜欢一个词:优雅,rxandroid能够很优雅的解决异步,特别是复杂的异步,rxandroid可以让逻辑更加简洁清晰。也许代码不一定比原来的少,但是rxandroid写出来的代码会更加清晰,更加让人容易理解。
rxandroid为什么有着么多人用?
说这个问题之前,你得先理解rxandroid。我在网上看到有人这样来比喻,我觉得挺形象的,借用一下:
它其实就是观察者模式的实现。观察者模式无非就是观察者与被观察着之间发生的那点儿事。
举个生活中的小例子来描述一下:
老师与学生的关系
我这里将老师比喻为被观察者,学生比喻为观察者。
设想一个这样的场景:老师在给学生们上课,老师会先让学生打开课本,然后老师噼里啪啦的讲一通,最后老师喊下课!
老师所做的所有动作都是被学生们看在眼里、听在耳里、记在脑子里的,所以假设是学生们一直在观察老师的所有动作,这么就理解了老师是被学生观察的对象,那老师就是被观察者,学生就是观察者。
理解了如上过程,我们再想一下:
- 老师如果说了句“打开第XX页”,那么学生是否就按老师说的做了?
- 老师如果在黑板上写下了XX结论或答案,那么学生是否就有可能记在课本或其他笔记中了?
- 老师如果一不小心滑倒了,那么是否有学生就会笑出声来?
其实这些动作都是老师做出来后,学生根据老师的表现或者指令来完成相应的动作?当然,学生们也可能对老师的某个表现不感兴趣,直接不理睬。
悄悄告诉你:android中为某个按钮设定了onClick等监听事件其实就是观察者模式。按钮就是被观察者,onClickListener就是观察者。当按钮发出点击事件时,onClickListener就会执行对应的动作。
rxandroid的简单用法
观察者与被观察者在RxAndroid的对应
观察者-Observer与Subscriber。Subscriber只是拓展了一下Observer的功能,它们本质上还是同一个东西。
被观察者-Observable。
Observer/Subscriber (观察者)的创建
Observer<String> observer = new Observer<String>() {
@Override
public void onNext(String s) {
Log.d(tag,"老师说了:"+s);
}
@Override
public void onCompleted() {
Log.d(tag,"哈哈!下课啦~");
}
@Override
public void onError(Throwable e) {
//onError之前没提到,可以把它想象成老师被校长紧急召唤去开会了之类的不能继续把课上完的情况。
//注意:onError一旦触发,onCompleted就不会再触发了。反之亦然~
Log.e(tag,"什么?老师有事没法完成这节课?咱们继续来斗地主吧,哈哈~");
}
};
Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onNext(String s) {
//同Observer
}
@Override
public void onCompleted() {
//同Observer
}
@Override
public void onError(Throwable e) {
//同Observer
}
};
Observable (被观察者)的创建
Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("上课!");
subscriber.onNext("打开课本第19页");
subscriber.onNext("今天的课后作业是……");
subscriber.onCompleted();//这个是下课的指令
}
});
Subscribe (订阅)
订阅其实就是建立关系。
我们创建了“学生”与“老师”,但他们还互相不认识呢,谁知道那么多老师哪个上我们的课啊?
这样:
observable.subscribe(observer);
// 或者:
observable.subscribe(subscriber);
为什么不是学生订阅了老师?其实是为了流式的写法而已。你可以理解成老师订阅了学生,也就是被观察者订阅了观察者。
这就是RxAndroid!至少大家可以知道RxAndroid是个什么玩意儿了,不会像第一次听别人说的时候认为是什么什么高深莫测的东西了。
对rxandroid的简单理解的更多相关文章
- git的简单理解及基础操作命令
前端小白一枚,最近开始使用git,于是花了2天看了廖雪峰的git教程(偏实践,对于学习git的基础操作很有帮助哦),也在看<git版本控制管理>这本书(偏理论,内容完善,很不错),针对所学 ...
- 简单理解Struts2中拦截器与过滤器的区别及执行顺序
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
- [转]简单理解Socket
简单理解Socket 转自 http://www.cnblogs.com/dolphinX/p/3460545.html 题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公 ...
- Js 职责链模式 简单理解
js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...
- Deep learning:四十六(DropConnect简单理解)
和maxout(maxout简单理解)一样,DropConnect也是在ICML2013上发表的,同样也是为了提高Deep Network的泛化能力的,两者都号称是对Dropout(Dropout简单 ...
- Deep learning:四十二(Denoise Autoencoder简单理解)
前言: 当采用无监督的方法分层预训练深度网络的权值时,为了学习到较鲁棒的特征,可以在网络的可视层(即数据的输入层)引入随机噪声,这种方法称为Denoise Autoencoder(简称dAE),由Be ...
- 简单理解dropout
dropout是CNN(卷积神经网络)中的一个trick,能防止过拟合. 关于dropout的详细内容,还是看论文原文好了: Hinton, G. E., et al. (2012). "I ...
- 我们为之奋斗过的C#-----C#的一个简单理解
我们首先来简单叙述一下什么是.NET,以及C#的一个简单理解和他们俩的一个区别. 1 .NET概述 .NET是Microsoft.NET的简称,是基于Windows平台的一种技术.它包含了能在.NET ...
- 简单理解ECMAScript2015中的箭头函数新特性
箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...
随机推荐
- Gulp基础
1.什么是gulp? gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器. 2.为什么使用gulp? gulp不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工 ...
- Sublime Text3 BracketHighlighter高亮色彩配置
今天玩Sublime ,结果安装了BracketHighlighter插件后,没效果,郁闷,度娘后总结如下: BracketHighlighter插件能为Sublime Text提供括号,引号这类高亮 ...
- 如何在Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作
Phpstorm除了能直接打开localhost文件之外,还可以连接FTP,除了完成正常的数据传递任务之外,还可以进行本地文件与服务端文件的异同比较,同一文件自动匹配目录上传,下载,这些功能是平常ID ...
- 百度链接提交-主动推送Python版
百度目前提供自动提交链接和手动提交链接两种方式,其中自动提交又分为主动推送.自动推送和sitemap三种形式,按百度的说法,主动推送的效果最好,百度站长平台后台也提供了curl.php.ruby的推送 ...
- 如何查看/统计当前AD域控制器的活动用户?
最近公司想知道某台AD域控制器上当前连接了多少活动用户? 此前个人只知道以下不是非常完善且统计起来比较麻烦的方法: 方法1:查看共享会话数.(不完全准确) 方法2:查看当前的DNS记录.(这种方法统计 ...
- ASP.NET 显示项目之外的图片
1.<asp:Image>标签的使用Loginer.images是图片的路径 this.images.ImageUrl = "showImg.aspx?imgFile=" ...
- string.Format格式化用法详解
1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...
- ueditor 1.4.3 gbk asp 上传中文乱码 终极解决方法 ie6 ie8 也适用
[摘要:百度编纂器1.43 gbk asp 题目 1.firefox3.0下 单图上传 面没有了 面多图上传 中央的蓝色按钮(即 面击挑选图片)没有表现(附件上传出那个题目) 没有晓得我的水狐吃翔了 ...
- (转)Sql日期时间格式转换
sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-0 ...
- Hamilton四元数群的表示
Hamilton四元数群$Q_8=\mathbb H=\{\pm e,\pm i,\pm j,\pm k\}$满足如下运算法则: $e$为单位元且同号得正.异号得负,此外$e=i^2=j^2=k^2, ...