Rxjava Learning
Basic Usage
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
e.onNext(1);
e.onNext(2);
e.onNext(3);
e.onComplete();
}
});
Observer<Integer> observer = new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG,"onSubscribe");
}
@Override
public void onNext(Integer value) {
Log.d(TAG,""+value);
}
@Override
public void onError(Throwable e) {
Log.d(TAG,"onError");
}
@Override
public void onComplete() {
Log.d(TAG,"onComplete");
}
};
observable.subscribe(observer);
//Run Results
03-13 13:59:33.957 4183-4183/com.example.uds.recyclerviewtest D/MAP: onSubscribe
03-13 13:59:33.958 4183-4183/com.example.uds.recyclerviewtest D/MAP: 1
03-13 13:59:33.958 4183-4183/com.example.uds.recyclerviewtest D/MAP: 2
03-13 13:59:33.958 4183-4183/com.example.uds.recyclerviewtest D/MAP: 3
03-13 13:59:33.958 4183-4183/com.example.uds.recyclerviewtest D/MAP: onComplete
Using Chain Calls
Observable.create(new ObservableOnSubscribe<Integer>{
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
e.onNext(1);
e.onNext(2);
e.onNext(3);
e.onComplete();
}
}).subscrib(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG,"onSubscribe");
}
@Override
public void onNext(Integer value) {
Log.d(TAG,""+value);
}
@Override
public void onError(Throwable e) {
Log.d(TAG,"onError");
}
@Override
public void onComplete() {
Log.d(TAG,"onComplete");
}
});
Two key objects: ObservableEmitter and Disposable
ObservableEmitter means transmitter, which is used to send events
onNext(T value) can be sent multiple times
onComplete() can be sent once, followed by onNext, but is no longer received
onError(Throwable error) can be sent only once, onNext can be received but not anymore
Disposable means one-time, throw-away when used up. Calling dispose() method cuts off communication between upstream and downstream
Although it is disconnected, the upstream can continue to send the remaining events, and the downstream can no longer receive them.
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
Log.d(TAG,"emit 1");
e.onNext(1);
Log.d(TAG,"emit 2");
e.onNext(2);
Log.d(TAG,"emit 3");
e.onNext(3);
e.onComplete();
}
}).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG,"onSubscribe");
mDisposable = d;
}
@Override
public void onNext(Integer value) {
Log.d(TAG,"onNext "+value);
if(value == 2){
Log.d(TAG,"disposable");
mDisposable.dispose();
Log.d(TAG,"isDisposed:" + mDisposable.isDisposed());
}
}
@Override
public void onError(Throwable e) {
Log.d(TAG,"onError");
}
@Override
public void onComplete() {
Log.d(TAG,"onComplete");
}
});
//Result
03-13 14:46:02.647 13356-13356/com.example.uds.recyclerviewtest D/MAP: onSubscribe
03-13 14:46:02.647 13356-13356/com.example.uds.recyclerviewtest D/MAP: emit 1
03-13 14:46:02.647 13356-13356/com.example.uds.recyclerviewtest D/MAP: onNext 1
03-13 14:46:02.647 13356-13356/com.example.uds.recyclerviewtest D/MAP: emit 2
03-13 14:46:02.647 13356-13356/com.example.uds.recyclerviewtest D/MAP: onNext 2
03-13 14:46:02.647 13356-13356/com.example.uds.recyclerviewtest D/MAP: disposable
03-13 14:46:02.647 13356-13356/com.example.uds.recyclerviewtest D/MAP: isDisposedtrue
03-13 14:46:02.647 13356-13356/com.example.uds.recyclerviewtest D/MAP: emit 3
Introduction to overloading method of subscribe()
public final Disposable subscribe() {}
public final Disposable subscribe(Consumer<? super T> onNext) {}
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError) {}
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete) {}
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete, Consumer<? super Disposable> onSubscribe) {}
public final void subscribe(Observer<? super T> observer) {}
Consumer only cares about onNext events
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
Log.d(TAG, "emit 1");
emitter.onNext(1);
Log.d(TAG, "emit 2");
emitter.onNext(2);
Log.d(TAG, "emit 3");
emitter.onNext(3);
Log.d(TAG, "emit complete");
emitter.onComplete();
Log.d(TAG, "emit 4");
emitter.onNext(4);
}
}).subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.d(TAG, "onNext: " + integer);
}
});