No1:

RxJava使用

dependencies{
compile 'io.reactivex:rxjava:1.2.0'
compile 'io.reactivex:rxandroid:1.2.1'
}

1)创建Observer(观察者)

Subscriber subscriber = new Subscriber<String>(){
@Override
public void onCompleted(){
Log.d(TAG,"onCompleted");
}
@Override
public void onError(Throwable e){
Log.d(TAG,"onError");
}
@Override
public void onNext(String s){
Log.d(TAG,"onNext"+s);
}
@Override
public void onStart(){
Log.d(TAG,"onStart");
}
}

或者

Observer<String> observer = new Observer<String>(){
@Override
public void onCompleted(){
Log.d(TAG,"onCompleted");
}
@Override
public void onError(Throwable e){
Log.d(TAG,"onError");
}
@Override
public void onNext(String s){
Log.d(TAG,"onNext"+s);
}
}

2)创建Observable(被观察者)

Observable observable = Observable.create(new Observable.OnSubscribe<String>){
@Override
public void call(Subscriber<? super String> subscriber){
subscriber.onNext("杨影枫");
subscriber.onNext("月媚儿");
subscriber.onCompleted();
}
}
//或者
Observable observable = Observable.just("杨影枫","月媚儿");
//或者
String[] words = {"杨影枫","月媚儿"};
Observable observable = Observable.from(words);

3)Subscribe(订阅)

observable.subscribe(subscriber);

No2:

RxJava的Subject

可以理解为Subject=Observal+Observer

1)PublishSubject:PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者

2)BehaviorSubject:当Observer订阅BehaviorSubject时,它开始发射原始Observable最近发射的数据

3)ReplaySubject:不管Observer何时订阅ReplaySubject,ReplaySubject均会发射所有来自原始Observable的数据给Observer

4)AsyncSubject:当Observable完成时,AsyncSubject只会发射来自原始Observable的最后一个数据

No3:

创建操作符:

1)interval:创建一个按固定时间间隔发射整数序列的Observable,相当于定时器

2)range:创建发射指定范围的整数序列的Observable,可以拿来替代for循环,发射一个范围内的有序整数序列

3)repeat:创建一个N次重复发射特定数据的Observable

变换操作符:

1)map:通过指定一个Func对象,将Observable转换为一个新的Observable对象并发射,观察者将收到新的Observable处理

2)flatmap:将Observable发射的数据集合变换为Observable集合,然后将这些Observable发射的数据平坦化地放进一个单独的Observable

3)cast:cast操作符的作用是强制将Observable发射的所有数据转换为指定类型

4)concatMap:和flatMap使用方法类似

5)flatMapIterable:可以将数据包装成Iterable,在Iterable中我们就可以对数据进行处理了

6)buffer:将源Observable变换为一个新的Observable,这个新的Observable每次发射一组列表值而不是一个一个发射

7)groupBy:用于分组元素,将源Observable变换成一个发射Observable的新Observable(分组后的)

过滤操作符:

1)filter:对源Observable产生的结果自定义规则进行过滤,只有满足条件的结果才会提交给订阅者

2)elementAt:用来返回指定位置的数据

3)distinct:用来去重,其只允许还没有发射过的数据项通过

4)skip:将源Observable发射的数据过滤掉前n项

5)take:只取前n项

6)ignoreElements:忽略所有源Observable产生的结果,只把Observable的onCompleted和onError事件通知给订阅者

7)throttleFirst:会定期发射这个时间段里源Observable发射的第一个数据,throttleFirst操作符默认在computation调度器上执行

8)throttleWithTimeOut:通过时间来限流。源Observable每次发射出来的一个数据后就会进行计时。如果在设定好的时间结束前源Observable有新的数据发射出来,这个数据就会被丢弃,同时throttleWithTimeOut重新开始计时。

组合操作符:

1)startWith:会在源Observable发射的数据前面插上一些数据

2)merge:将多个Observable合并到一个Observable中进行发射,merge可能会让合并的Observable发射的数据交错

3)concat:将多个Observable发射的数据进行合并发射。concat严格按照顺序发射数据,前一个Observable没发射完成时不会发射后一个Observable的数据的

4)zip:合并两个或者多个Observable发射出的数据项,根据指定的函数变换它们,并发射一个新值

5)combineLastest:当两个Observable中的任何一个发射了数据时,使用一个函数结合每个Observable发射的最近数据项,并且基于这个函数的结果发射数据

辅助操作符:

1)delay:让原始Observable在发射每项数据之前都暂停一段指定的时间段

2)Do系列操作符:包括doOnEach、doOnNext、doOnSubscribe、doOnCompleted、doOnError、doOnTerminate、finallyDo

3)subscribeOn:用于指定Observable自身在哪个线程上运行

4)observeOn:用来指定Observer所运行的线程,也就是发射出的数据在哪个线程上使用。一般会指定在主线程中运行,这样就可以修改UI

5)timeout:如果原始Observable过了指定的一段时长没有发射任何数据,timeout操作符会以一个onError通知终止这个Observable,或者继续执行一个备用的Observable。

错误处理操作符:

1)catch:拦截原始Observable的onError通知,将它替换为其他数据项或者数据序列,让产生的Observable能够正常终止或者根本不终止。包括onErrorReturn、onErrorResumeNext、onExceptionResumeNext

2)retry:不会将原始Observable的onError通知传递给观察者,它会订阅这个Observable,再给它一次机会无错误地完成其数据序列。

布尔操作符:

1)all:根据一个函数对源Observable发射的所有数据进行判断,最终返回的结果就是这个判断结果。

2)contains:用来判断Observable所发射的数据是否包含某一个数据

3)isEmpty:用来判断源Observable是否发射过数据

条件操作符:

1)amb:对于给定两个或多个Observable,它只发射首先发射数据或通知的那个Observable的所有数据

2)defaultIfEmpty:发射来自原始Observable的数据,如果原始Observable没有发射数据,就发射一个默认数据

转换操作符:

1)toList:将发射多项数据且为每一项数据调用onNext方法的Observable发射的多项数据组合成一个List

2)toSortedList:类似于toList操作符:不同的是,它会对产生的列表排序,默认是自然升序

3)toMap:收集原始Observable发射的所有数据项到一个Map(默认是HashMap),然后发射这个Map

No4:

RxJava线程控制:想切换线程,需要使用Scheduler

1)Scheduler.immediate():直接在当前线程运行,它是timeout、timeInterval和timeStamp操作符的默认调度器

2)Schedulers.newThread():总是启用新线程,并在新线程执行操作

3)Schedulers.io():I/O操作所使用的Scheduler

4)Schedulers.computation():计算所使用的Scheduler

5)Schedulers.trampoline():当我们想在当前线程执行一个任务时,并不是立即时,可以用.trampoline()将它入列

6)AndroidSchedulers.mainThread():RxAndroid库中提供的Scheduler,它指定的操作在主线程中运行

No5:

RxJava结合OkHttp访问网络

private Observable<String> getObservable(final String ip){
Observable observable = Observable.create(new Observable.OnSubscribe<String>(){
@Override
public void call(final Subscriber<? super String> subscriber){
mOkHttpClient = new OkHttpClient();
RequestBody formBody = new FormBody.Builder().add("ip",ip).build();
Request request = new Request.Builder().url("http://ip.taobao.com/service/getIpInfo.php").post(formBody).build();
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback(){
@Override
public void onFailure(Call call,IOException e){
subscriber.onError(new Exception("error"));
}
@Override
public void onResponse(Call call,Response response) throws IOException{
String str = response.body().string();
subscriber.onNext(str);
subscriber.onCompleted();
}
});
}
});
return observable;
}
private void postAsynHttp(String size){
getObservable(size).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<String>(){
@Override
public void onCompleted(){
Log.d(TAG,"onCompleted");
}
@Override
public void onError(Throwable e){
Log.d(TAG,e.getMessage());
}
@Override
public void onNext(String s){
Log.d(TAG,s);
Toast.makeText(getApplicationContext(),"请求成功",Toast.LENGTH_SHORT).show();
}
});
}

No6:

RxJava结合Retrofit访问网络

No7:

RxJava实现RxBus

《Android进阶之光》--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. BZOJ 4614[Wf2016]Oil

    权限题鸭qwq 首先可以知道最优答案选出来的直线一定可以经过某条线段左端点,如果这条直线没有过左端点,可以通过平移和旋转等操作达到.所以可以枚举这条直线过了哪条线段的左端点,那么对于其他线段,能对答案 ...

  2. POJ2516 Minimum Cost【最小费用最大流】

    题意: 有N个客户,M个仓库,和K种货物.已知每个客户需要每种货物的数量,每个仓库存储每种货物的数量,每个仓库运输各种货物去各个客户的单位费用.判断所有的仓库能否满足所有客户的需求,如果可以,求出最少 ...

  3. Python中的部分特殊属性

    __name__ is the class name;   返回类名 __module__ is the module name in which the class was defined;   定 ...

  4. JSON的理解

    官方解释: JSON的全称是”JavaScript Object Notation”,单单从字面上的理解就是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式. 理解: ...

  5. UML和模式应用1: 面向对象的分析与设计

    1.基本术语说明 items note OOA/D  面向对象的分析与设计 UML 描述.构造和文档化系统制品的可视化语言 模式 问题解决方案的公式 2. 本书的主要内容 本书的主旨是对应用了UML和 ...

  6. 安装jdk的时候为什么会有两个jre文件

    有些东西,你懂不懂其实并不太影响你干活,但有些人就是有疑惑就非得弄懂,不然浑身难受,我大概就是这种德性的.昨天安装javaSE的时候,看到jdk中有个jre文件夹,而根目录下又有个jre文件夹,非常困 ...

  7. Java快速学习笔记01

    这一波快速学习主要是应付校招笔面试用,功利性质不可避免. 学习网址: http://www.runoob.com/java/java-tutorial.html 执行命令解析: 以上我们使用了两个命令 ...

  8. 003_Linux的Cgroup<实例详解>

    为什么要有cgroup Linux系统中经常有个需求就是希望能限制某个或者某些进程的分配资源.也就是能完成一组容器的概念,在这个容器中,有分配好的特定比例的cpu时间,IO时间,可用内存大小等.于是就 ...

  9. CentOS 6.5环境下heartbeat高可用集群的实现及工作原理详解

    Linux HA Cluster高可用服务器集群,所谓的高可用不是主机的高可用,而是服务的高可用. 什么叫高可用:一个服务器down掉的可能性多种多样,任何一个可能坏了都有可能带来风险,而服务器离线通 ...

  10. 【前端】三个bug

    目录 一.Array对象的indexOf() 二.使用jquery,clone()下拉框问题 三.jquery获取获取html5的data-*属性 一.Array对象的indexOf() 1.inde ...