更多文章请点击链接http://77blogs.com/?p=162

转载请标明出处https://www.cnblogs.com/tangZH/p/12088300.htmlhttp://77blogs.com/?p=162

RxJava究竟是啥,从根本上来讲,它就是一个实现异步操作的库,并且能够使代码非常简洁。它的异步是使用观察者模式来实现的。

关于观察者模式的介绍,可以看我这一篇文章:

https://www.cnblogs.com/tangZH/p/11175120.html

这里我主要讲RxJava的一些基本用法,基本案例,原理的话暂时不深究:

一、自己构造事件

Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter emitter) {
int i = getNumber();
if (i < 0) {
emitter.onComplete();
return;
} else {
Log.d(TAG, Thread.currentThread().getName());
emitter.onNext(i);
emitter.onComplete();
}
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.d(TAG, Thread.currentThread().getName());
Log.d(TAG, integer + "");
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception { }
});

RxJava 有四个基本概念:Observable (可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件。Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer

onNext():方法用来发送事件。

下面看看其他两个方法:

  • onCompleted(): 事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的 onNext() 发出时,需要触发 onCompleted() 方法作为标志。
  • onError(): 事件队列异常。在事件处理过程中出异常时,onError() 会被触发,同时队列自动终止,不允许再有事件发出。
  • 在一个正确运行的事件序列中, onCompleted() 和 onError() 有且只有一个,并且是事件序列中的最后一个。需要注意的是,onCompleted() 和 onError() 二者也是互斥的,即在队列中调用了其中一个,就不应该再调用另一个。

讲一下我们上面的例子,上面这个例子是采用简洁的链式调用来写的:

首先使用 create() 方法来创建一个 Observable ,并为它定义事件触发规则,然后通过emitter.onNext(i)传递出来,.subscribeOn(Schedulers.io())便是指定该事件产生的所在的线程为子线程,.observeOn(AndroidSchedulers.mainThread())指定观察者执行的线程为主线程。这时候为止返回的对象为Observable对象。

然后该Observable对象subscribe绑定观察者(也就是观察者进行订阅),里面有接收被观察者发出来的事件,有一个成功的方法,和一个失败的方法,这样就实现了由被观察者向观察传递事件。

二、对集合里的数据进行变换

        List<Integer> list = new ArrayList<Integer>() {
{
add(0);
add(1);
add(2);
}
};
Observable.fromIterable(list).map(new Function() {
@Override
public Object apply(Object o) throws Exception {
int i = (int) o + 1;
return String.valueOf(i);
}
})
.toList()
.toObservable().subscribeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(Object o) throws Exception {
Log.d(TAG, o.toString());
}
});

且看,我们需要对某个集合里面的数据一一进行变换,然后发送出来执行其他操作。

上面便是对集合里面的每一项进行加一操作,然后再转换为String类型,然后toList(),组合成集合发送出来,最后在观察者方法中打印出每一项。

三、合并执行

定义两个被观察者,各自产生事件,然后合并在一起,发送给一个观察者。

首先定义我们上面第一个例子的被观察者,用于发送一个数字:

        Observable observable1 = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter emitter) {
int i = getNumber();
if (i < 0) {
emitter.onComplete();
return;
} else {
Log.d(TAG, Thread.currentThread().getName());
emitter.onNext(i);
emitter.onComplete();
}
}
})
.subscribeOn(Schedulers.io());

其次再定义我们上面第二个例子的被观察者:

        List<Integer> list = new ArrayList<Integer>() {
{
add(0);
add(1);
add(2);
}
};
Observable observable2 = Observable.fromIterable(list).map(new Function() {
@Override
public Object apply(Object o) {
int i = (int) o + 1;
return String.valueOf(i);
}
})
.toList()
.toObservable().subscribeOn(Schedulers.io());

最后将这两个被观察者的事件合并起来发送给一个观察者:

        Disposable disposable = Observable.zip(observable1, observable2, new BiFunction() {
@Override
public Object apply(Object o, Object o2) throws Exception {
int i = (int) o;
String k = (String) ((List) o2).get(0);
return k + i;
}
})
.subscribe(new Consumer() {
@Override
public void accept(Object o) {
Log.d(TAG, (String) o);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) {
Log.d(TAG, throwable.getMessage());
}
});

zip方法,顾名思义,有点类似与于打包的意思。

o为被观察者1返回的结果,o2为被观察2返回的结果,将这两个结果一起处理后发送给观察者。打印出来。

现在先介绍这几个,找个时间再整理一些其他的用法以及原理实现。

RxJava基本使用的更多相关文章

  1. Android性能优化之利用Rxlifecycle解决RxJava内存泄漏

    前言: 其实RxJava引起的内存泄漏是我无意中发现了,本来是想了解Retrofit与RxJava相结合中是如何通过适配器模式解决的,结果却发现了RxJava是会引起内存泄漏的,所有想着查找一下资料学 ...

  2. Android消息传递之基于RxJava实现一个EventBus - RxBus

    前言: 上篇文章学习了Android事件总线管理开源框架EventBus,EventBus的出现大大降低了开发成本以及开发难度,今天我们就利用目前大红大紫的RxJava来实现一下类似EventBus事 ...

  3. 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~

    一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...

  4. Android MVP+Retrofit+RxJava实践小结

    关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...

  5. 【腾讯Bugly干货分享】基于RxJava的一种MVP实现

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57bfef673c1174283d60bac0 Dev Club 是一个交流移动 ...

  6. Rxjava Subjects

    上次提到调用observable的publish和connect方法后可以将一个Observable发出的对象实时传递到订阅在上的subscriber. 这个和Rxjava中Subject的概念十分相 ...

  7. Rxjava cold/hot Observable

    create Observable分为cold以及hot两种,cold主要是静态的,每次subscribe都是从头开始互不干扰,而hot的在同一时刻获得的值是一致的 cold Observable 使 ...

  8. Android开发学习之路-Android中使用RxJava

    RxJava的核心内容很简单,就是进行异步操作.类似于Handler和AsyncTask的功能,但是在代码结构上不同. RxJava使用了观察者模式和建造者模式中的链式调用(类似于C#的LINQ). ...

  9. [Android]在Dagger 2中使用RxJava来进行异步注入(翻译)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客: # 在Dagger 2中使用RxJava来进行异步注入 > 原文: 几星期前我写了一篇关于在Dagger 2中使用*Producers*进行 ...

  10. RXJava by Example--转

    原文地址:https://www.infoq.com/articles/rxjava-by-example Key takeaways Reactive programming is a specif ...

随机推荐

  1. 008_linuxC++之_类的静态变量和静态函数

    (一)看程序 #include <iostream> #include <string.h> #include <unistd.h> using namespace ...

  2. Proxy详解

    一.Proxy基础 1. 什么是Proxy? Proxy是一个构造函数,可以通过它生成一个Proxy实例. const proxy = new Proxy(target, handler); // t ...

  3. Emacs:十六进制模式下跳转到特定地址

    造冰箱的大熊猫@cnblogs 2019/9/18 Emacs提供的十六进制模式(M-x hexl-mode)以十六进制格式显示文件内容,对于分析图像等二进制数据文件非常方便.在此模式下,我们可以使用 ...

  4. Codeforces Educational Codeforces Round 67

    目录 Contest Info Solutions A. Stickers and Toys B. Letters Shop C. Vasya And Array D. Subarray Sortin ...

  5. 费马小定理 x

    费马小定理(Fermat Theory) 是数论中的一个重要定理,其内容为: 假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(mod p).即:假如a是整数,p是质数,且a,p互质(即两 ...

  6. ubuntu14.04重启网卡的三种方法

    Linux重启网卡的三种方法: 一.network 利用root帐户 # service network restart 或者/etc/init.d/networking restart 二.ifdo ...

  7. linux java -jar

    常见命令1 nohup java -jar /xxx/xxx/xxx.jar >/dev/>& & 分析各个指令代表什么意思: >,重写文件,如果文件里面有内容会覆盖 ...

  8. wqy的C题

    wqy的C题 毒瘤! 题意: 你有一张 $ n $ 个点 $ m $ 条边的无向图. 你想在这张图上添加 $ n $ 条有向边,每一条有向边连接两个点 $ u,v $ ,你需要保证 $ u,v $ 在 ...

  9. python数据分析与应用

    python数据分析与应用笔记 使用sklearn构建模型 1.使用sklearn转换器处理数据 import numpy as np from sklearn.datasets import loa ...

  10. 走进JavaWeb技术世界2:JSP与Servlet的曾经与现在

    转载自:码农翻身 转自: 刘欣 码农翻身 1周前 我是Servlet, 由于很多框架把我深深地隐藏了起来,我变得似乎无关紧要了,很多人也选择性的把我给遗忘了. 其实,我还活得好好的呢, 只不过是从前台 ...