1、扩展的观察者模式
onComoleted()事件
onError()事件
2、四要素
1)Observable被观察者
2)Observer观察者
3)subscribe订阅
4)事件
3、hello World
说明:onCompleted()和onError()只回调一个
package rxjava;
import rx.Observable;
import rx.Subscriber;
public class HelloWorld {
public static void main(String[] args) {
//第一步:创建被观察者
Observable mObservable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("hello world!!!");
subscriber.onCompleted();
//subscriber.onError(new NullPointerException());
}
});
//创建观察者
Subscriber subscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
System.out.println("onCompleted()");
}
@Override
public void onError(Throwable throwable) {
System.out.println("onError():" + throwable.getMessage());
}
@Override
public void onNext(String s) {
System.out.println("onNext():" + s);
}
};
//订阅事件
mObservable.subscribe(subscriber);
}
}
运行结果:
onNext():hello world!!!
onCompleted()
4、Creating Observables(创建Observable)
(1)Create
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("create!!!");
}
}).subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
System.out.println("onCompleted()");
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onNext(String s) {
System.out.println("onNext():" + s);
}
});
运行结果:
onNext():create!!!
注意,只打印onNext()
(2)Just
Observable.just("just").subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
System.out.println("onCompleted()");
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onNext(String s) {
System.out.println("onNext():" + s);
}
});
运行结果:
onNext():just
onCompleted()
注意,先打印onNext()再打印onCompleted()
(3)From
1)数组
Observable.from(new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9}).subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("onCompleted()");
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onNext(Integer integer) {
System.out.println("onNext():" + integer);
}
});
运行结果:
onNext():1
onNext():2
onNext():3
onNext():4
onNext():5
onNext():6
onNext():7
onNext():8
onNext():9
onCompleted()
2)list
ArrayList<Integer> items = new ArrayList<>();
for (int i = 0; i < 10; i++) {
items.add(i);
}
Observable.from(items).subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("onCompleted()");
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onNext(Integer integer) {
System.out.println("onNext():" + integer);
}
});
运行结果:
onNext():0
onNext():1
onNext():2
onNext():3
onNext():4
onNext():5
onNext():6
onNext():7
onNext():8
onNext():9
onCompleted()
(4)Defer
1)如果valueStr为空
private static String valueStr;
private static void defer() {
//在调用subscribe这个方法之前不会去创建Observable对象
Observable observable = Observable.defer(new Func0<Observable<String>>() {
@Override
public Observable<String> call() {
return Observable.just(valueStr);
}
});
observable.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
System.out.println("onCompleted()");
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onNext(String s) {
System.out.println("onNext():" + s);
}
});
}
运行结果:
onNext():null
onCompleted()
2)如果valueStr不为空
private static String valueStr;
private static void defer() {
//在调用subscribe这个方法之前不会去创建Observable对象
Observable observable = Observable.defer(new Func0<Observable<String>>() {
@Override
public Observable<String> call() {
return Observable.just(valueStr);
}
});
valueStr = "rxjava";
observable.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
System.out.println("onCompleted()");
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onNext(String s) {
System.out.println("onNext():" + s);
}
});
}
运行结果:
onNext():rxjava
onCompleted()
(5)Empty/Never/Throw
//创建一个不发射任何数据但是正常终止的Observable
Observable.<String>empty().subscribe(new Observer<String>() {
@Override
public void onNext(String s) {
System.out.println("onNext():" + s);
}
@Override
public void onCompleted() {
System.out.println("onCompleted():");
}
@Override
public void onError(Throwable e) {
System.out.println("onError:" + e.getMessage());
}
});
运行结果:onCompleted():
//创建一个不发射数据也不终止的Observable
Observable.<String>never().subscribe(new Observer<String>() {
@Override
public void onNext(String s) {
System.out.println("onNext():" + s);
}
@Override
public void onCompleted() {
System.out.println("onCompleted():");
}
@Override
public void onError(Throwable e) {
System.out.println("onError:" + e.getMessage());
}
});
运行结果:什么都没打印
(6)Interval
定时器,1s间隔一次
Observable.<String>interval(1, TimeUnit.SECONDS).subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
System.out.println("aLong:" + aLong);
}
});
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
运行结果:
aLong:0
aLong:1
aLong:2
aLong:3
aLong:4
aLong:5
aLong:6
aLong:7
aLong:8
aLong:9
aLong:10
aLong:11
aLong:12
aLong:13
aLong:14
还会一直打印下去。
(7)Range
Range操作符发射一个范围内的有序整数序列,你可以指定范围的起始和长度。
RxJava将这个操作符实现为range
函数,它接受两个参数,一个是范围的起始值,一个是范围的数据的数目。如果你将第二个参数设为0,将导致Observable不发射任何数据(如果设置为负数,会抛异常)
Observable.<String>range(2, 10).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println("integer:" + integer);
}
});
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
运行结果:
integer:2
integer:3
integer:4
integer:5
integer:6
integer:7
integer:8
integer:9
integer:10
integer:11
从2到11,一共10个
(8)Repeat
创建一个发射特定数据重复多次的Observable
Observable.range(1, 2).repeat(3).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println("-------->" + integer);
}
});
运行结果:
-------->1
-------->2
-------->1
-------->2
-------->1
-------->2
1到2重复3次
(9)Start
(10)Timer
创建一个Observable,它在一个给定的延迟后发射一个特殊的值
//它在一个给定的延迟后发射一个特殊的值
Observable.timer(3, TimeUnit.SECONDS).subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
System.out.println("aLong-------->" + aLong);
}
});
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
运行结果:aLong-------->0