对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值,也 ...
随机推荐
- java.lang.NoClassDefFoundError: Lorg/slf4j/Logger;
如果你出现类似如下错误 1. Install tomcat7 in my home directory and set up `CATALINA_HOME` environment variable ...
- linux下, 再次遇到使用thinkphp的模板标签时,报错used undefined function \Think\Template\simplexml_load_string() 是因为没有安装 php-xml包
linux下, 使用thinkphp的模板标签,如 eq, gt, volist defined, present , empty等 标签时, 报错: used undefined function ...
- MD5工具类,提供字符串MD5加密、文件MD5值获取(校验)功能
MD5工具类,提供字符串MD5加密(校验).文件MD5值获取(校验)功能 : package com.yzu.utils; import java.io.File; import java.io.Fi ...
- JDBC入门学习
Introduction What's JDBC JDBC stands for Java Database Connectivity, which is a standard Java API fo ...
- 输出 Office 报表
以 word 为例: 将 word 存为 Word2003 XML,其中苹果等部分即是 xml 如下: 服务器端通常输出 HTML,HTML 是文本,XML也是文本,可以简单的套用服务器端网页的思路. ...
- JS学习:第二周——NO.1回调函数
[回调函数] 定义:把一个函数的定义阶段,作为参数,传给另一个函数: 回调函数调用次数,取决于条件: 回调函数可以传参: 回调函数可以给变this指向,默认是window: 回调函数没有返回值,for ...
- appium for hybrid app 处理webview
之前研究了一段时间的appium for native app 相应的总结如下: appium测试环境搭建 :ht ...
- 《Neural Network and Deep Learning》_chapter4
<Neural Network and Deep Learning>_chapter4: A visual proof that neural nets can compute any f ...
- item2快捷键
整理使用 iTerm 2 过程中得常用快捷键,Mac 原来自带的终端工具 Terminal 不好用是出了名的,虽然最近几个版本苹果稍微做了些优化,功能上,可用性方面增强不少,无奈有个更好用的 Iter ...
- Python实现简单的Web完整版(一)
在拖了一周之后,今天终于在一个小时之内将一个迷你的Web写出来了,最近改其它项目的bug头好大,但是好喜欢这样的状态. 黑色的12月,所有的任务都聚集在了12月,然后期末考试也顾不上好好复习了,但是但 ...