1.前言
在前面的一篇文章中介绍了RxJava的一些基本概念和RxJava的最简单用法,如果对这两个不是很清楚的话建议去看看RxJava—入门介绍。从本章开始会开始聊聊RxJava中的操作符(Operators),RxJava之所以强大是因为它提供了丰富且功能强大的操作符,通过使用和组合这些操作符几乎可以完成所有想要完成的任务,RxJava的操作符主要分为:创建操作符、转换操作符、过滤操作符、组合操作符、错误处理操作符、功能性操作符、条件操作符、数学运算及聚合操作符、其它操作符等。
在本章的内容中主要介绍创建操作符,常见的创建操作符有:create()、just()、from()、defer()、interval()、timer()、range()、repeat()。
2.创建操作符的使用
(1)Create()
create()操作符是所有创建型操作符的“根”,也就是说其他创建型操作符最后都是通过create操作符来创建Observable的,它的作用是从头开始创建一个Observable对象,默认不在任何调度器上运行。
根据官方给出的原理图:
现在要使用create()创建一个Observable对象
Observable.create(new Observable.OnSubscribe<Integer>()
{
public void call(Subscriber<? super Integer> subscriber)
{
try
{
if(!subscriber.isUnsubscribed())
{
for(int i = 0; i < 5; i++)
{
subscriber.onNext(i);
}
subscriber.onCompleted();
}
}
catch (Exception e)
{
subscriber.onError(e);
}
}})
.subscribe(new Subscriber<Integer>()
{
public void onCompleted()
{
Log.d("Create", "onCompleted()");
}
public void onError(Throwable e)
{
e.printStackTrace();
Log.d("Create", "onError()");
}
public void onNext(Integer integer)
{
Log.d("Create", "onNext:" + integer);
}
});
当点击按钮后在控制台上,可以看到这样的结果:
(2)From
from()操作符是把其他类型的对象和数据类型转化成Observable,在RxJava中,from()操作符可以转换Future、Iterator和数组,产生的Observable会发射Iterator或数组的每一项数据。from()默认不在任何特定的调度器上执行。然而你可以将Scheduler作为可选的第二个参数传递给Observable,它会在那个调度器上管理这个Future。
根据官方给出的原理图:
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
Observable.from(list)
.subscribe(new Action1<String>()
{
public void call(String s)
{
Log.d("From", s);
}
});
当点击按钮后在控制台上,可以看到这样的结果:A B C D E
根据官方给出的原理图:
Observable.just("A", "B", "C", "D", "E")
.subscribe(new Action1<String>()
{
public void call(String s)
{
Log.d("Just", s);
}
});
根据官方给出的原理图:
根据官方给出的原理图:
Observable.interval(1, TimeUnit.SECONDS)
.subscribe(new Action1<Long>()
{
public void call(Long aLong)
{
Log.d("interval", aLong.toString());
}
});
以上代码是以秒为单位,每过1秒发射一个数据
根据官方给出的原理图:
Observable.range(0, 10)
.subscribe(new Action1<Integer>()
{
public void call(Integer integer)
{
Log.d("range", integer.toString());
}
});
根据官方给出的原理图:
Observable.just("1", "2", "3")
.repeat(2)
.subscribe(new Action1<String>()
{
public void call(String s)
{
Log.d("repeat", s);
}
});
当点击按钮后在控制台上,可以看到这样的结果:1 2 3 1 2 3
(8)Timer
根据官方给出的原理图:
final SimpleDateFormat sdf = new SimpleDateFormat("HH:MM:SS");
final String beginTime = sdf.format(new Date());
Log.d("timer", "beginTime: " + beginTime);
Observable.timer(2, TimeUnit.SECONDS)
.subscribe(new Action1<Long>()
{
public void call(Long aLong)
{
Log.d("timer", aLong.toString());
String endTime = sdf.format(new Date());
Log.d("timer", "endTime: " + endTime);
}
});
当点击按钮后在控制台上,可以看到这样的结果: