上一篇中,介紹了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這些接口是有返回值的。