//这个例子中onNext()会被调用多次
PublishSubject.create()
.subscribe(new Subscriber<Object>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Object o) {
//会被多次调用
}
});
Single.just(4).map(new Func1<Integer, String>() {
@Override
public String call(Integer integer) {
return String.valueOf(integer);
}
})
.subscribe(new SingleSubscriber<String>() {
@Override
public void onSuccess(String value) {
//mValueDisplay.setText(value);
}
@Override
public void onError(Throwable error) {
}
});
/综合使用
final PublishSubject<String> mSearchResultsSubject = PublishSubject.create();
sub = mSearchResultsSubject
.debounce(400, TimeUnit.MILLISECONDS)
//这个方法告诉mSearchResultsSubject在没有数据传入达400毫秒时才发送数据
//当用户400ms都没有改变输入内容时,Subject才会发送最新的搜索字符串
.observeOn(Schedulers.io())
//我们想通过RestClient来访问服务器,而因为RestClient涉及IO操作,我们需要在IO Scheduler中进行这个操作,所以要写observeOn(Schedulers.io())。
.map(new Func1<Object, Object>() {
@Override
public Object call(Object o) {
//在map中我们可以调用任意外部方法,这里可以调用任意外部方法
return null;//在这里进行网络请求
}
})
.observeOn(AndroidSchedulers.mainThread())
//因为map方法会在IO Scheduler中运行,而我们又要用其返回值填充View,
// 所以要重新切换到UI线程,所以要写observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Object>(){
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Object o) {
//在这里展示数据
}
});
/**
* 如果在doOnSubscribe()之后指定了subscribeOn(),它决定了doOnSubscribe()在哪种线程中执行。
* (1)doOnSubscribe()之前的subscribeOn()不会影响它。
* (2)doOnSubscribe()之后的subscribeOn(),且是最近的才会影响它。
* doOnSubscribe用于在call之前执行一些初始化操作
*/
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(2323);
}
}).subscribeOn(AndroidSchedulers.mainThread()) // 在doOnSubscribe()之前,不会影响上面的doOnSubscribe()
.doOnSubscribe(new Action0() {
@Override
public void call() {
//显示提示框
}
}).subscribeOn(Schedulers.io()) // 会影响上面的doOnSubscribe()
.observeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread()) // 不会影响上面的doOnSubscribe()
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
}
});