RxJava操作符的简单使用
一、准备工作在app的build.gradle文件下的dependencies中添加依赖:
compile 'io.reactivex:rxjava:1.3.0'
compile 'io.reactivex:rxandroid:1.2.1'
二、RxJava的操作符用法:
1、create
//create 创建Observable
//Observable 被观察者
//Subscribers观察者 Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
Log.i(TAG,"call.....");
if(!subscriber.isUnsubscribed()) {
subscriber.onNext("我被执行了1"); //只有完成了下面的订阅方法才能执行onNext等方法
subscriber.onNext("我被执行了2");
subscriber.onNext("我被执行了3");
subscriber.onNext("我被执行了4");
subscriber.onNext("我被执行了5");
subscriber.onNext("我被执行了6"); subscriber.onCompleted();
}
}
}); //完成订阅
observable.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.i(TAG,"onCompleted") ;
} @Override
public void onError(Throwable e) {
Log.i(TAG,"onError:"+e.getMessage());
} @Override
public void onNext(String s) {
Log.i(TAG,"onNext:"+s);
}
}) ;
2、from
//from 也可以创建Observable 讲int类型的数组01234转化为Observable,通过订阅的onNext可以一个个的取到数组的值
Integer[] arr = {0,1,2,3,4};
//完成创建Observable
Observable<Integer> from = Observable.from(arr);
//完成订阅
from.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
Log.i(TAG,"onCompleted") ;
} @Override
public void onError(Throwable e) {
Log.i(TAG,"onError:"+e.getMessage());
} @Override
public void onNext(Integer i) {
Log.i(TAG,"onNext:"+i);
}
}) ;
3、just
//just 也可以创建Observable 参数是可变参数
Observable.just(0, 1, 2, 3, 4, 5)
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.i(TAG,"call:"+integer);
}
}) ;
4、map
//map 变换,在该实例中,将Integer转换成String
//在实际开发中,需要通过String类型的url获取到图片 String[] urls = {};
Observable.from(urls)
.map(new Func1<String, Bitmap>() { //第一个参数为传入的类型,第二个参数为返回的类型
@Override
public Bitmap call(String s) {
//s 代表图片url,网络请求通过url 获取到图片
return null;
}
}).subscribe(new Action1<Bitmap>() { // 获取的的Bitmap类型再进行订阅处理
@Override
public void call(Bitmap bitmap) {
//iv.setBackage()
}
}); /*Observable.just(0,1,2,3)
.map(new Func1<Integer, String>() {
@Override
public String call(Integer integer) {
return integer+"转换了";
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.i(TAG,"call:"+s);//0转换了 1转换了。。。
}
});*/
5、flatMap
//flatmap 转换 将多个Observable转换成一个Observalbe然后发送
//获取城市的天气 /**
*
* map 是将一种类型转换成另一种类型(可以是任意类型)
*
* flatmap 是将一种类转换成Observable(泛型可以是任意的)
*
*/ String[] citys = {"北京","上海","杭州"};
Observable.from(citys)
.flatMap(new Func1<String, Observable<WeathData>>() {
@Override
public Observable<WeathData> call(String s) {
return getCityWeathData(s);
}
}).subscribe(new Action1<WeathData>() {
@Override
public void call(WeathData weathData) {
Log.i(TAG,weathData.city+weathData.state);
}
});
此处用到的getCityWeathData方法返回出来一个泛型为WeathData的Observable:
/**
* 获取一个城市的天气数据
* @param city
* @return
*/
private Observable<WeathData> getCityWeathData(final String city){
return Observable.just(city)
.map(new Func1<String, WeathData>() {
@Override
public WeathData call(String s) {
//通过网络请求获取城市的天气数据
WeathData weathData = new WeathData();
weathData.city = city ;
weathData.state = "晴天" ;
return weathData ;
}
});
}
6、zip
//zip 将两个Observable按照规则严格的合成一个Observable
Observable<Integer> observable1 = Observable.just(10, 20, 30,40);
Observable<Integer> observable2 = Observable.just(1, 2, 3,4); Observable.zip(observable1, observable2, new Func2<Integer, Integer, String>() {
@Override
public String call(Integer integer, Integer integer2) {
//定义合并规则
return integer + integer2 + "abc";
}
}).subscribe(new Action1<String>() {
@Override
public void call(String string) {
Log.i(TAG,"call:"+string) ;
}
});
7、zipWith
//zipwith 将本身与其他的Observable按照规则严格的合并成一个Observable
Observable.just(10,20,30,40)
.zipWith(Observable.just("a", "b", "c"), new Func2<Integer, String, String>() {
@Override
public String call(Integer integer, String s) {
//合并规则
return integer + s ;
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.i(TAG,"call:"+s) ;
}
});
8、retry
//retry 在出错的时候重试(异常的时候重新执行)
//用处:网络连接异常的时候
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
try {
for (int i = 0; i < 5; i++) {
if (i == 3) {
throw new Exception("出错了");
}
subscriber.onNext(i);
}
subscriber.onCompleted();
}catch (Exception e){
subscriber.onError(e);
}
}
}).retry(2).subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
Log.i(TAG,"onCompleted");
} @Override
public void onError(Throwable e) {
Log.i(TAG,"onError:"+e.getMessage()) ;
} @Override
public void onNext(Integer integer) {
Log.i(TAG,"onNext:"+integer) ;
}
});
9、retryWhen
//retrywhen 异常的时候执行
//网络请求框架中,一般使用retryWhen 要执行操作是连接网络,连接出异常的时候,
// 1、我们可以直接重复执行连接网络,retry
// 2、同时我们也可以判断连接异常的类型,再做决定是否重连 retyrWhen
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
Log.i(TAG,"总出错");
subscriber.onError(new Throwable("出错了"));
}
}).retryWhen(new Func1<Observable<? extends Throwable>, Observable<?>>() {
@Override
public Observable<?> call(Observable<? extends Throwable> observable) {
return observable.zipWith(Observable.range(1, 3), new Func2<Throwable, Integer, Integer>() {
@Override
public Integer call(Throwable throwable, Integer integer) {
return integer;
}
}).flatMap(new Func1<Integer, Observable<?>>() {
@Override
public Observable<?> call(Integer integer) {
//timer 延迟执行的操作符
Log.i(TAG,"延迟"+integer+"秒");
return Observable.timer(integer, TimeUnit.SECONDS);
}
});
}
}).subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
Log.i(TAG,"onCompleted");
} @Override
public void onError(Throwable e) {
Log.i(TAG,"onError:"+e.getMessage()) ;
} @Override
public void onNext(Integer integer) {
Log.i(TAG,"onNext:"+integer) ;
}
}) ;
10、filter
//filter 按照规则过滤
Observable.just(0,1,2,3,4,5)
.filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
return integer < 2;
}
}).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.i(TAG,"call:"+integer) ;
}
});
。。。
RxJava操作符的简单使用的更多相关文章
- Java操作符真的简单到易如反掌?
之前我写了一篇<吃人的那些Java名词:对象.引用.堆.栈和堆栈>,本以为凭借自己8年的Java编程经验足够把这些“吃人”的Java名词解释清楚了,但有网友不以为然,在文章底部评论说:“老 ...
- RxJava 操作符 on和doOn 线程切换 调度 Schedulers 线程池 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- RxJava操作符总结之过滤
RxJava操作符总结之过滤 jsut() just(T t1, T t2, T t3 ....) ,just能够传入多个同样类型的參数,并将当前參数一个接着一个的发送. Observable.jus ...
- RxJava操作符实践:8_算术和聚合操作之3_min
发射原始Observable的最小值. Min操作符操作一个发射数值的Observable并发射单个值:最小的那个值. RxJava中,min属于rxjava-math模块. min接受一个可选参数, ...
- Rxjava - 操作符,线程操作的简单使用
目录 创建操作符 10种常用的操作符定义 下面做几个操作符的demo演示 create from repeat defer interval Scheduler 什么是Scheduler? 如何使用S ...
- RxJava操作符(08-条件和布尔操作)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51671826 本文出自:[openXu的博客] 目录: All Amb Contains D ...
- RxJava操作符(07-辅助操作)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51658445 本文出自:[openXu的博客] 目录: Delay Do Materiali ...
- RxJava操作符(03-变换操作)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51649975 本文出自:[openXu的博客] 目录: Buffer FlatMap fla ...
- RxJava操作符(02-创建操作)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51645348 本文出自:[openXu的博客] 目录: Create Defer Empty ...
随机推荐
- EOS技术研究:合约与数据库交互
智能合约操作链数据库是很常见的应用场景.EOS提供了专门的工具来做这件事(相当于Ethereum的leveldb),专业术语叫做持久化API,本文将完整严密地介绍这个工具以及对它的使用测试. 关键字: ...
- Unity3D学习(四):小游戏Konster的整体代码重构
前言 翻了下之前写的代码,画了个图看了下代码结构,感觉太烂了,有很多地方的代码重复啰嗦,耦合也紧,开个随笔记录下重构的过程. 过程 _____2017.10.13_____ 结构图: 目前发现的待改进 ...
- npm安装项目出错
F:\ajax>npm install iview --savenpm WARN saveError ENOENT: no such file or directory, open 'F:\aj ...
- SQLMap入门之在Windows上安装SQLMap
前言: SQLMap是一个开放源代码的sql注入工具,SQLMap是使用Python语言开发成的,他的运行需要有Python环境的支持.写这篇文章时我使用的SQLMap版本是"sqlmap- ...
- windows命令中的cd
cd命令的作用为改变文件夹,也就是跳转目录.切换路径的意思.它后面可以接驱动器符号.完整路径和相对路径. 打开命令行窗口的时候,默认的目录位于当前用户所在的路径下,比如:C:\Users\koi\De ...
- Semaphore简介
Semaphore简介 Semaphore是并发包中提供的用于控制某资源同时被访问的个数 操作系统的信号量是个很重要的概念,在进程控制方面都有应用.Java 并发库 的Semaphore 可以很轻松完 ...
- NOI前的考试日志
4.14 网络流专项测试 先看T1,不会,看T2,仙人掌???wtf??弃疗.看T3,貌似最可做了,然后开始刚,刚了30min无果,打了50分暴力,然后接着去看T1,把序列差分了一下,推了会式子,发现 ...
- Hibernate-ORM:02.Hibernate增删改入门案例
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本笔者使用的是Idea+mysql+maven做Hibernate的博客,本篇及其以后都是如此! 首先写好思路 ...
- webpack Code Splitting浅析
Code Splitting是webpack的一个重要特性,他允许你将代码打包生成多个bundle.对多页应用来说,它是必须的,因为必须要配置多个入口生成多个bundle:对于单页应用来说,如果只打包 ...
- 并发的核心:CAS 与synchronized, Java8是如何优化 CAS 的?
大家可能都听说说 Java 中的并发包,如果想要读懂 Java 中的并发包,其核心就是要先读懂 CAS 机制,因为 CAS 可以说是并发包的底层实现原理. 今天就带大家读懂 CAS 是如何保证操作的原 ...