最近发现这个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的简单理解的更多相关文章

  1. git的简单理解及基础操作命令

    前端小白一枚,最近开始使用git,于是花了2天看了廖雪峰的git教程(偏实践,对于学习git的基础操作很有帮助哦),也在看<git版本控制管理>这本书(偏理论,内容完善,很不错),针对所学 ...

  2. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

  3. [转]简单理解Socket

    简单理解Socket 转自 http://www.cnblogs.com/dolphinX/p/3460545.html  题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公 ...

  4. Js 职责链模式 简单理解

    js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...

  5. Deep learning:四十六(DropConnect简单理解)

    和maxout(maxout简单理解)一样,DropConnect也是在ICML2013上发表的,同样也是为了提高Deep Network的泛化能力的,两者都号称是对Dropout(Dropout简单 ...

  6. Deep learning:四十二(Denoise Autoencoder简单理解)

    前言: 当采用无监督的方法分层预训练深度网络的权值时,为了学习到较鲁棒的特征,可以在网络的可视层(即数据的输入层)引入随机噪声,这种方法称为Denoise Autoencoder(简称dAE),由Be ...

  7. 简单理解dropout

    dropout是CNN(卷积神经网络)中的一个trick,能防止过拟合. 关于dropout的详细内容,还是看论文原文好了: Hinton, G. E., et al. (2012). "I ...

  8. 我们为之奋斗过的C#-----C#的一个简单理解

    我们首先来简单叙述一下什么是.NET,以及C#的一个简单理解和他们俩的一个区别. 1 .NET概述 .NET是Microsoft.NET的简称,是基于Windows平台的一种技术.它包含了能在.NET ...

  9. 简单理解ECMAScript2015中的箭头函数新特性

    箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...

随机推荐

  1. iOS之访问权限以及跳转到系统界面

    iOS开发中有时候有这样的需求:当用户设置不允许访问照片.麦克风和相机等系统权限的时候,这时需要直接跳转到系统的隐私界面进行设置. 判断是否开启权限 前面已经说过,我们需要在用户不允许访问的时候跳转, ...

  2. jsp标签

    常规的jsp标签,导入如下 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #3933ff } span.s1 ...

  3. TCP学习之一:TCP网络编程概念

    参考学习张子阳大神的博客:http://www.cnblogs.com/JimmyZhang/category/101698.html 一.TCP 面向连接的(UDP是无连接的) 全双工,建立连接之后 ...

  4. Android ActionBar 初探

    1.指南,例子,个人感觉 首先上官网指南链接http://developer.android.com/guide/topics/ui/actionbar.html 参考了官网上的例子http://de ...

  5. 【转】将Oracle数据库设置为归档模式

    查看归档状态为非归档sys@JSSBOOK> select log_mode from v$database;LOG_MODE------------NOARCHIVELOG archive状态 ...

  6. 他山之石——vs2013 安装与部署及程序打包

    C#打包需要这个:InstallShield 2013 Limited Edition for Visual Studio  .下载地址: InstallShield 2013 Limited Edi ...

  7. .net mvc中的表单异步提交

    // // 摘要: // 将 <form> 开始标记写入响应. // // 参数: // ajaxHelper: // AJAX 帮助器. // // actionName: // 将处理 ...

  8. BZOJ2134——单选错位

    1.题意:这就是说考试的时候抄串了一位能对几个(雾) 2.分析:这是一个期望问题,期望就是平均,E(a+b)=E(a)+E(b),所以我们直接算出每个点能对几个就好,那么就是1/max(a[i],a[ ...

  9. 我的js函数库(持续更新)

    常用js初始化函数 function id(obj) { return document.getElementById(obj); } function bind(obj, ev, fn) { if ...

  10. PHP 文件夹操作「复制、删除、查看大小」递归实现

    PHP虽然提供了 filesize.copy.unlink 等文件操作的函数,但是没有提供 dirsize.copydir.rmdirs 等文件夹操作的函数(rmdir也只能删除空目录).所以只能手动 ...