上一篇中,介绍了RxJava的基本用法,下面就更多的用法进行介绍。
ActionX
ActionX为不完整定义的回调,最常用的就是Action0和Action1接口,他们都有一个call方法,Action0是没有参数的,Action1是有参数的,像这样:
Action0 action0 = new Action0() {
@Override
public void call() {
}
};
Action1<String> action1 = new Action1<String>() {
@Override
public void call(String s) {
}
};
具体用法如下:
String[] names = {"robot", "rose"};
Observable.from(names).subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.i("rxjava", s);
}
});
多线程操作
前面说过,Rxjava强大之处之一就有对线程的控制,而且使用起来及其简便,比android带的asynctask还要好用,只需要subscribeOn()和observeOn()两个方法就能实现线程切换。我先介绍一下Scheduler ,这就是线程控制器,有两个我们经常用的Schedulers.io()和AndroidSchedulers.mainThread(),分别指我们另起的新线程和android的主线程。
subscribeOn()指定订阅者被激活的线程,observeOn()指定事件消费的线程,就是观察者运行的线程。就像下面的代码:
String[] names = {"robot", "rose"};
Observable.from(names)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.i("rxjava", s);
}
});
这段代码就是发送”names” 这个事件会在新线程中发送,而打印log这个事件会发生在主线程中。通常我们有耗时操作的话,都会用这种方式来处理。
变换
这个功能很强大,可以让我们利用操作符(Operators)进行很多随心所欲的操作。比如下面这段使用map()操作符:
Observable.just(100)
.map(new Func1<Integer, String>() {
@Override
public String call(Integer i) {
return String.valueOf(i);
}
})
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.i("rxjava", s);
}
});
可以看到,map里面有Func1这个接口,他和ActionX这些接口类似,只不过FuncX这些接口是有返回值的。