对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值,也 ...
随机推荐
- Linux C 信号 pause、sigsuspend 的相同与区别
pause函数: 功能:让进程暂停直到信号出现 #include<unistd.h> intpause(); 函数说明:pause()会令目前的进程暂停(进 ...
- 忘记mysql root 密码修改小技巧
首先我说一下我的情况,我并不是忘记了我的root密码,只不过是我在使用phpmyadmin的时候更改密码的时候选择了如图1 的这个方法将密码加密并更改了,然后就再次登录的时候登录不上,所以对于菜鸟级的 ...
- JSP内置对象之request对象【学习笔记】
request对象是JSP中重要的对象,每个request对象封装着一次用户的请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取请求参数的重要途径. 一.获取请求头与 ...
- CJCMS系列--demo代码篇
CJCMS之前写了不多的文章,但是一直没有上代码,也许代码写得很乱很差,但是我觉得总得有个开始,持续改进.作为一个喜欢分享的程序员,我决定分享一下. 前面文章中的结构比较全,而此次我给出的demo,没 ...
- IIS部署遇到的一些问题
IIS部署时候会遇到一些具体的问题,记录一下.此处的部署环境为Windows Server 2012 64位版本 1.基本部署:角色和功能管理-->web服务器,勾选相应的服务与功能,然后安装即 ...
- [C++]for同时遍历两个数组
C++11同时遍历两个数组 #define for2array(x,y,xArray,yArray) \ for(auto x=std::begin(xArray), x##_end=std::end ...
- sql server2008给数据表,字段,添加修改注释
1 -- 表加注释 2 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'注释内容' , @level0type=N' ...
- yum 保存下载包
--- 1 --- $ sudo yum install yum-plugin-downloadonly $ sudo yum install --downloadonly --downloaddir ...
- kettle转换和作业插件开发及调试
这是一篇几年前写下的文档,最近打算根据这篇文档重写一下kettle插件的教程.结果各种理由,一推再推.今天索性将这篇文档发布出来,分享给大家,例子等有空再补上.这是一篇基于kettle3.2基础上完成 ...
- andriod刷机
有句古话叫常在河边走,难免会翻船.对于经常刷机的Android刷友来说,难免会碰到刷机失败损坏recovery程序乃至手机无法启动的情况,也就是传说中的手机变砖块.不过刷机失败手机变砖并不是世界末日, ...