Rxjava的几种Subject:
Subject 既是 Observable 又是 Observer(Subscriber)。官网称 Subject 可以看成是一个桥梁或者代理。
介绍下边几种AsyncSubject、BehaviorSubject、ReplaySubject和PublishSubject。
1. AsyncSubject
Observer会接收AsyncSubject的onComplete()之前的最后一个数据。
2. BehaviorSubject
Observer会接收到BehaviorSubject被订阅之前的最后一个数据,再接收订阅之后发射过来的数据。如果BehaviorSubject被订阅之前没有发送任何数据,则会发送一个默认数据。
3. ReplaySubject
ReplaySubject会发射所有来自原始Observable的数据给观察者,无论它们是何时订阅的。
4. PublishSubject
Observer只接收PublishSubject被订阅之后发送的数据。
public class SubjectLearn {
public static void main(String[] args){
//testAsyncSubject();
// testBehaverSubject();
// testReplaySubJect();
testPubshSubject();
}
private static void testAsyncSubject(){
AsyncSubject<String> subject = AsyncSubject.create();
subject.onNext("item1");
subject.onNext("item2");
subject.onComplete();
subject.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
System.out.println("async" + s);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
System.out.println("onError:" + throwable.getMessage());
}
}, new Action() {
@Override
public void run() throws Exception {
System.out.println("onComplete");
}
});
subject.onNext("item3");
subject.onNext("item4");
}
private static void testBehaverSubject(){
BehaviorSubject<String> subject = BehaviorSubject.createDefault("default item");
subject.onNext("item0");
subject.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
System.out.println("接受到:" + s);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
System.out.println("错误:" + throwable);
}
}, new Action() {
@Override
public void run() throws Exception {
System.out.println("结束");
}
});
subject.onNext("item1");
subject.onNext("item2");
}
public static void testReplaySubJect(){
ReplaySubject<String> subject = ReplaySubject.createWithSize(1);
subject.onNext("item1");
subject.onNext("item2");
subject.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
System.out.println("收到:" + s);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
System.out.println("错误:" + throwable);
}
}, new Action() {
@Override
public void run() throws Exception {
System.out.println("结束");
}
});
subject.onNext("item3");
subject.onNext("item4");
subject.onComplete();
}
public static void testPubshSubject(){
PublishSubject<String> subject = PublishSubject.create();
subject.onNext("item1");
subject.onNext("item2");
//subject.onComplete();
subject.subscribeOn(Schedulers.io())
.subscribe(new Consumer<String>() {
@Override
public void accept(String o) throws Exception {
System.out.println("收到:" + o);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
System.out.println("错误:" + throwable);
}
}, new Action() {
@Override
public void run() throws Exception {
System.out.println("结束");
}
});
subject.onNext("item3");
subject.onNext("item4");
subject.onComplete();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}