一、准备工作在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操作符的简单使用的更多相关文章

  1. Java操作符真的简单到易如反掌?

    之前我写了一篇<吃人的那些Java名词:对象.引用.堆.栈和堆栈>,本以为凭借自己8年的Java编程经验足够把这些“吃人”的Java名词解释清楚了,但有网友不以为然,在文章底部评论说:“老 ...

  2. RxJava 操作符 on和doOn 线程切换 调度 Schedulers 线程池 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. RxJava操作符总结之过滤

    RxJava操作符总结之过滤 jsut() just(T t1, T t2, T t3 ....) ,just能够传入多个同样类型的參数,并将当前參数一个接着一个的发送. Observable.jus ...

  4. RxJava操作符实践:8_算术和聚合操作之3_min

    发射原始Observable的最小值. Min操作符操作一个发射数值的Observable并发射单个值:最小的那个值. RxJava中,min属于rxjava-math模块. min接受一个可选参数, ...

  5. Rxjava - 操作符,线程操作的简单使用

    目录 创建操作符 10种常用的操作符定义 下面做几个操作符的demo演示 create from repeat defer interval Scheduler 什么是Scheduler? 如何使用S ...

  6. RxJava操作符(08-条件和布尔操作)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51671826 本文出自:[openXu的博客] 目录: All Amb Contains D ...

  7. RxJava操作符(07-辅助操作)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51658445 本文出自:[openXu的博客] 目录: Delay Do Materiali ...

  8. RxJava操作符(03-变换操作)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51649975 本文出自:[openXu的博客] 目录: Buffer FlatMap fla ...

  9. RxJava操作符(02-创建操作)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51645348 本文出自:[openXu的博客] 目录: Create Defer Empty ...

随机推荐

  1. markdown 一分钟入门

    markdown 很好的一门标记语言 语法简单,记住下面的就入门了,一分钟不到 使用范围广,各式各样的编辑器支持markdown,评论也是支持的, 一般文档后缀为.md markdown 基本用法记住 ...

  2. cas 4.1.4单点登录实战

    使用工具 maven-3.3.9 cas-4.1.4 Tomcat-7.0.57-win-x64 cas-sample-Java-webapp 一.Hello cas 1.下载Tomcat,解压:修改 ...

  3. 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”

    报错: 解决:在语句开头指定SET NOCOUNT ON 就是这么神cao奇dan. -END-

  4. BackBox错误,无法获得锁...资源暂时不可用...无法锁定管理目录

    今天准备给BackBox安装leafpad时,输入 sudo apt install leafpad 后出现了如下的错误提示: E: 无法获得锁 /var/lib/dpkg/lock - open ( ...

  5. SQL*Loader FAQ

    SQL*Loader FAQ: Contents [hide]  1 What is SQL*Loader and what is it used for? 2 How does one use th ...

  6. web前端 DOM 详解

    先来点概念 文档对象模型(DOM)是一个独立于语言的,使用 XML 和 HTML 文档操作的应用程序接口(API). 在浏览器中,主要与 HTML 文档打交道,在网页应用中检索 XML 文档也很常见. ...

  7. JS 总结----基础部分

    javascript基础:1.每个属性都可以加ID2.写函数的时候注意 == 和 = 不要写错了3.html里面怎么写js里面就怎么写,但是有一例外 className 比如oDiv.class = ...

  8. Latex数学公式中的空格表示方法

    两个quad空格 a \qquad b 两个m的宽度 quad空格 a \quad b 一个m的宽度 大空格 a\ b 1/3m宽度 中等空格 a\;b 2/7m宽度 小空格 a\,b 1/6m宽度 ...

  9. leetcode 26 80 删除已排序数组中重复的数据

    80. Remove Duplicates from Sorted Array II Follow up for "Remove Duplicates":What if dupli ...

  10. Python跨目录调程序

    #!/usr/bin/python # -*- coding: utf-8 -*- # 导入其它目录下的文件, 需要去帮获取当前程序的绝对路径并加入到环境变量的相对路径中 import os impo ...