最簡單的觀察者模式
//被觀察者
public class Observable {
public interface Listener {
void call();
}
Observable.Listener mListener = null;
public static Observable create(Listener listener) {
mListener = listener;
}
public void someMethod() {
mListener.call();
}
}
//創(chuàng)建被觀察者對象, 傳入Observable.Listener對象
Observable observable = Observable.create(new Observable.Listener() {
@override
void call() {
//do something
}
抽象出來一個觀察者接口(Subscriber), 在調(diào)用被觀察者的方法時被作為參數(shù)回調(diào)
public class Observable {
public interface onSubscribe {
void call(Subscriber subscriber);
}
Observable.onSubscribe mOnSubscribe = null;
public static Observable create(onSubscribe pOnSubscribe) {
mOnSubscribe = pOnSubscribe;
}
public void subscribe(Subscriber subscribe) {
mOnSubscribe.call(subscribe); //把subscribe作為call方法的參數(shù)回調(diào)
}
}
//觀察者
public interface Subscriber {
void onNext(String string);
}
Observable observable = Observable.create(new Observable.onSubscribe() {
@override
void call(Subscriber subscriber) {
//do something
subscriber.next("1");
subscriber.next("2");
subscriber.next("3");
}
});
這時如果新建一個Subscriber對象, 并將它傳參到observable對象的subscribe方法中:
Subscriber subscriber = new Subscriber() {
@override
void onNext(String string) {
// 打印string
}
};
observable.subscribe(subscriber);
//subscriber對象打印出
"1"
"2"
"3"
將代碼連貫起來
Observable.create(new Observable.onSubscribe() {
@override
void call(Subscriber subscriber) {
//do something
subscriber.next("1");
subscriber.next("2");
subscriber.next("3");
}
}).subscribe(new Subscriber() {
@override
void onNext(String string) {
// 打印string
}
});
RxJava提供了一些Observable的創(chuàng)建方法, 不需要實(shí)現(xiàn)Observable.onSubscribe接口
Observable.just(1, 2, 3, 4)
.subscribe(new Action1<Integer>() {
@Override public void call(Integer number) {
Log.d(tag, "number:" + number);
}
});
其中, 在RxJava中Subscriber是Observer的子類