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