RxJava是square公司开发的一个用户进行异步操作的类库。功能非常强大,以下介绍几种简单的使用。
1、普通异步操作
Flowable.just("nil").subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Throwable {
Log.i("TAG","name is "+s);
}
});
这是rxjava最简单的应用,是将输入的字符串输出,这里注意的是subscribe方法是定义消费者的意思,RXjava是基于观察者模式实现异步操作的,subscribe定义消费者,在消费者中进行对应操作。注意subscribe是订阅的,按理说应该是消费者订阅被观察者,这里只是为了这种链式调用所以把api故意写为这样,大家无需理会
2、线程切换
Flowable.just("nil")
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Throwable {
Log.i("TAG","name is "+s);
}
});
通过subscribeOn指订阅现成即执行操作的现成,observeOn为显影线程,即Consumer中实现方法的执行的线程。Schedulers中的方法这里不做枚举了,最主要的就是这两个,如果集成了rxAndroid,还会有个AndroidSchedulers.mainThread(),一般是用在observeOn中,用户主线程更新UI等
3、类型转换
rxJava最好用,最两点的功能,就是能够异步就输入类型进行转换处理,并在消费者出进行回调处理
Boy boy = new Boy();
boy.setAge("23");
boy.setName("john");
boy.setHigh("180cm");
Flowable.just(boy).map(new Function<Boy, String>() {
@Override
public String apply(Boy boy) throws Throwable {
return boy.getHigh();
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Throwable {
Log.i("Tag","high is : "+s);
}
});
上述代码中被观察对象输入是个boy,但是在观察者消费的方法中,所检测的参数却是一个string 字符串(身高)。
4、flatMap
Boy boy2 = new Boy();
boy2.setAge("24");
boy2.setName("john2");
boy2.setHigh("182cm");
Boy[] boys = new Boy[]{boy,boy2};
Consumer boyConsumer = new Consumer<Boy>() {
@Override
public void accept(Boy o) throws Throwable {
Log.i("TAG","high is :"+o.getHigh());
}
};
Observable.fromArray(boys).flatMap(new Function<Boy, ObservableSource<?>>() {
@Override
public ObservableSource<?> apply(Boy boy) throws Throwable {
return Observable.just(boy);
}
}).subscribe(boyConsumer);
当要同事注册多个被观察者,就需要用flatmap,flatmap会将所有的被观察者放入一个数列中依次进行订阅。
以上只是为了对rxjava的应用进行简单阐述,觉得例子比较简单,所以其实不用rxjava可能会更简单,但是这里只是简单阐述,几个常用的方法,遇到需要异步场景时,脑中能够考虑rxjava的应用就达到目的了。
rxjava还提供一些其他的小功能,比如延时执行,定时执行等这里就不再赘述了,有兴趣的同学可以自己看一下api。
延时五秒执行
Flowable.just("nil")
.delay(5, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Throwable {
Log.i("TAG","name is "+s);
}
});
定时5s执行一次
Flowable.interval(5, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long s) throws Throwable {
Log.i("TAG","name is "+s);
}
});