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 ...
随机推荐
- Junit-4.1.2 @Test 使用
学习使用Junit-4.1.2 @Test来做单元测试 1.下载jar包 下载junit-4.12.jar 下载hamcrest-core-1.3.jar 2.在External Libraries中 ...
- Python中的 socket示例
linux send与recv函数详解 1 #include <sys/socket.h> 2 ssize_t recv(int sockfd, void *buff, size_t ...
- Centos7安装Redis3.2.8
一.系统环境和版本说明 Redis的版本选取目前的官网版本redis-3.2.8. 二.Redis的安装步骤 2.1 在线下载Redis的安装包 [root@localhost lzh]# ...
- 定时器Timer的使用
概述 Timer类的主要作用是设置计划任务,但封装任务的类却是TimerTask类.执行计划任务的代码要放入TimerTask的子类中,因为TimerTask是一个抽象类. 方法schedule(ta ...
- Spring通过构造方法注入的四种方式
通过构造方法注入,就相当于给构造方法的参数传值 set注入的缺点是无法清晰表达哪些属性是必须的,哪些是可选 的,构造注入的优势是通过构造强制依赖关系,不可能实例化不 完全的或无法使用的bean. Me ...
- spring security oauth2
https://connect.qq.com/manage.html#/ http://wiki.connect.qq.com/%E7%BD%91%E7%AB%99%E5%BA%94%E7%94%A8 ...
- webpack + vue 在dev和production模式下的小小区别
上周的某一天,和一位同样是前端技术极度爱好的开发者朋友聊天,他在提出了一个问题,他写的vue程序为什么在dev模式运行良好,而在production模式就直接报错了.这让我感到惊讶,还有这么神奇的事情 ...
- 说一说js中__proto__和prototype以及原型继承的那些事
在面试中遇到过,问js如何实现继承,其实最好的方式就是构造函数+原型,今天在讨论中,发现自己以前理解上的一些误区,特地写出来,最近都比较忙,等手上的项目做完,可以来做个总结. 先说我以前没有认识到位的 ...
- Python 枚举
1. 枚举的定义 首先,定义枚举要导入enum模块.枚举定义用class关键字,继承Enum类.用于定义枚举的class和定义类的class是有区别. 示例代码: from enum import E ...
- 如何查看selenium的版本号
方法一: 打开cmd,输入python >>> import selenium >>> help(selenium) Help on package seleniu ...