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 ...
随机推荐
- 一个完整的html 每个标签的含义
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- mysql SQL Layer各个模块介绍
https://blog.csdn.net/cymm_liu/article/details/45821929
- MyBatis系列目录--5. MyBatis一级缓存和二级缓存(redis实现)
转载请注明出处哈:http://carlosfu.iteye.com/blog/2238662 0. 相关知识: 查询缓存:绝大数系统主要是读多写少. 缓存作用:减轻数据库压力,提供访问速度. 1. ...
- 使用XAMPP和DVWA在Windows7上搭建渗透测试环境
前言: XAMPP是一个Web应用程序运行环境集成软件包,包括MySQL.PHP.PerI和Apache的环境及Apache.MySQL.FilleZilla.Mercury和Tomecat等组件.D ...
- 用户体验很好的密码校验js
<div class="form-group" data-reactid=".0.1.1.0.1.1.3.0.1.1"><label for= ...
- jquery-bootgrid
http://www.jquery-bootgrid.com/GettingStarted 日志是生产环境非常重要的配置,在迁移老的工程到spring-boot时日志的设置兼容很重要,以下是自己在配置 ...
- thinter中button按钮控件(三)
button控件 简单的实现: import tkinter wuya = tkinter.Tk() wuya.title("wuya") wuya.geometry(" ...
- 你不知道的JavaScript--Item5 全局变量
1.尽量少用全局对象 全局变量的问题在于,你的JavaScript应用程序和web页面上的所有代码都共享了这些全局变量,他们住在同一个全局命名空间,所以当程序的两个不同部分定义同名但不同作用的全局变量 ...
- Python将html转化为pdf
前言 前面我们对博客园的文章进行了爬取,结果比较令人满意,可以一下子下载某个博主的所有文章了.但是,我们获取的只有文章中的文本内容,并且是没有排版的,看起来也比较费劲... 咋么办的?一个比较好的方法 ...
- CountDownLatch简介
CountDownLatch是并发包中提供的一个可用于控制多个线程同时开始某动作的类,可以看做是一个计数器,计数器操作是院子操作,同时只能有一个线程去操作这个计数器.可以向CountDownLatch ...