RxJava操作符的简单使用
Posted happy-warmth
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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操作符的简单使用的主要内容,如果未能解决你的问题,请参考以下文章