Rxjava四要素
被觀察者
在Rxjava當(dāng)中,
決定什么時(shí)候觸發(fā)事件,
決定觸發(fā)什么樣的事件;-
觀察者
決定事件觸發(fā)的時(shí)候?qū)a(chǎn)生什么樣的行為;
類似于
傳統(tǒng)觀察者模式,
觀察者會(huì)隨著被觀察者的狀態(tài)變化而發(fā)生相應(yīng)的操作;
-
訂閱
區(qū)別于傳統(tǒng)
觀察者模式;觀察者和被觀察者需要通過訂閱來聯(lián)系;通過
subscribe()方法完成這個(gè)訂閱關(guān)系;完成訂閱關(guān)系后,
即可令被觀察者(Observable)在需要的時(shí)候,
發(fā)出事件來通知觀察者(Observer)
-
事件
- 區(qū)別于傳統(tǒng)
觀察者模式;
(下面詳說)
- 區(qū)別于傳統(tǒng)
事件
- 乃
響應(yīng)式編程中的核心概念; -
響應(yīng)式編程乃基于異步數(shù)據(jù)流概念的編程模式;
理解響應(yīng)式編程
- 場(chǎng)景舉例:
客戶端從服務(wù)端獲取到最新的數(shù)據(jù)時(shí),
需要通知客戶端本身相關(guān)模塊進(jìn)行更新(如UI變換顯示等);
這其實(shí)便是一種響應(yīng)式編程——
客戶端根據(jù)服務(wù)端的變化做出相應(yīng);生活中的例子
- 天氣冷了我們就要多穿件衣服。
天氣冷了,就是一種事件;
要多穿件衣服,就是基于事件做出的響應(yīng);- 餓了要吃飯。
餓了,就是一種事件;
吃飯,就是基于事件做出的響應(yīng);
代碼分析
- 第一步,
(通過create())創(chuàng)建被觀察者(Observable),即第一個(gè)基本要素,
其中注意OnSubscribe<String>()對(duì)象,
記住它是存儲(chǔ)在Observable當(dāng)中的;
當(dāng)Observable訂閱之后,
它會(huì)啟動(dòng)OnSubscribe<String>()對(duì)象中的回調(diào)方法call(),
同時(shí)運(yùn)行call()方法體中寫好的反應(yīng)序列;
//第一步:創(chuàng)建被觀察者:create
Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello");
subscriber.onNext("Imooc");
subscriber.onCompleted();
}
});
-
.
其中,其實(shí)
Subscriber就是我們的觀察者;
后面的Rxjava源碼閱讀中,
我們會(huì)發(fā)現(xiàn)Observer在源碼中也會(huì)被轉(zhuǎn)換成Subscriber來進(jìn)行相應(yīng)的處理,
所有才說其實(shí)Subscriber就是我們的觀察者;以上我們可以看到,在
create一個(gè)被觀察者時(shí),
我們new了一個(gè)OnSubscribe<String>(),
并在其中實(shí)現(xiàn)了回調(diào)方法call(),
回調(diào)方法中調(diào)用了觀察者的方法——
在創(chuàng)建被觀察者時(shí),使用了調(diào)用了觀察者方法的回調(diào)方法,
這其實(shí)就是一種事件的傳遞;
最后將這個(gè)OnSubscribe<String>()賦給被觀察者的創(chuàng)建方法create();
如此便跟傳統(tǒng)觀察者模式聯(lián)系起來了;
(只不過這里Rxjava給我們做好了更好的封裝)
-
以上是
創(chuàng)建被觀察者的一種方法,
事實(shí)上還有其他兩種:第二種,通過
just()方法創(chuàng)建,
只要把參數(shù)放到just()方法中,以逗號(hào)分隔開來即可,
而just()其實(shí)就是將參數(shù)依次通過事件發(fā)送出來,
這種寫法其實(shí)是跟上面的兩個(gè)onNext()、一個(gè)onCompleted()的寫法是一樣的;第三種,通過
from()方法,
類似于第二種方法,只是把傳給just的參數(shù)組合成一個(gè)String數(shù)組在傳給from();
這種寫法其實(shí)是跟上面的兩個(gè)onNext()、一個(gè)onCompleted()的寫法是一樣的;
以上三種方法其實(shí)都是等價(jià)的,其最終目的都是
創(chuàng)建被觀察者;
//通過just方法來創(chuàng)建被觀察者
Observable observableJust = Observable.just("hello", "Imooc");
//通過from方法來創(chuàng)建被觀察者
String[] parameters = {"hello", "Imooc"};
Observable observableFrom = Observable.from(parameters);
-
第二步,
創(chuàng)建觀察者Observer/Subscriber,即第二個(gè)要素,
1.在傳統(tǒng)的觀察者模式當(dāng)中,觀察者只有一個(gè)update()方法,
在其中根據(jù)被觀察者的狀態(tài)變化而做出反應(yīng)/改變;-
而在Rxjava中,框架給出了三個(gè)方法;
其中onCompleted()和onError()兩個(gè)方法就是對(duì)傳統(tǒng)觀察者模式做出的改變/區(qū)別,
而onNext()其實(shí)就是傳統(tǒng)觀察者模式當(dāng)中的update();
-
onCompleted():當(dāng)不再有新的事件通過被觀察者發(fā)出的時(shí)候回調(diào); -
onError(): 在處理異??蚣軙r(shí)回調(diào); -
onNext():同理傳統(tǒng)觀察者模式當(dāng)中的update(),
即編寫 當(dāng)被觀察者發(fā)生狀態(tài)改變時(shí),觀察者的處理邏輯;
-
而在Rxjava中,框架給出了三個(gè)方法;
//第二步:創(chuàng)建觀察者
Observer<Object> observer = new Observer<Object>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Object s) {
}
};
被觀察者Observable是用過鏈?zhǔn)秸{(diào)用來執(zhí)行的;
為的是讓后面的操作符、線程控制等能夠跟流式OPI來完善,
而不是其他方式如觀察者去訂閱被觀察者(非鏈?zhǔn)剑?/code>——
這樣從意思上容易理解,但在API調(diào)用上很不方便;- 鏈?zhǔn)秸{(diào)用:理解比較繞,但能跟
流式OPI來完善,API調(diào)用上非常方便;- 非鏈?zhǔn)秸{(diào)用:意思上容易理解,但在API調(diào)用上很不方便;
-
第三步,訂閱:
前面我們說概念的時(shí)候,都是觀察者訂閱被觀察者的,
可是這里代碼中,
“奇怪”的是“被觀察者(Observable)去訂閱(subscribe)觀察者(Observer)”,
這里就是上面說的,
為了后面能夠通過流式OPI,
使進(jìn)行操作符、線程控制等操作時(shí)能夠通過鏈?zhǔn)秸{(diào)用來完善;
所以這里Rxjava中把訂閱設(shè)計(jì)成“被觀察者(Observable)去訂閱(subscribe)觀察者(Observer)”
public void doRxjava(){
//第三步:訂閱
observable.subscribe(observer);
}
- 本節(jié)完整代碼如下:
這里其實(shí)只是
Rxjava的一種簡(jiǎn)單的使用,
主要是理解一下Rxjava對(duì)傳統(tǒng)觀察者設(shè)計(jì)模式的拓展和改進(jìn);
實(shí)際情況當(dāng)中,其實(shí)它還包括了很多操作符,
以及Rxjava最核心的線程控制調(diào)度,
這兩部分是Rxjava的核心.
package com.example.jiajiemu.a11.rxjava;
import rx.Observable;
import rx.Observer;
import rx.Subscriber;
/**
* Created by Mjj on 2017/10/6.
*/
public class RxjavaCreateDemo {
//第一步:創(chuàng)建被觀察者:create
Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello");
subscriber.onNext("Imooc");
subscriber.onCompleted();
}
});
//通過just方法來創(chuàng)建被觀察者
Observable observableJust = Observable.just("hello", "Imooc");
//通過from方法來創(chuàng)建被觀察者
String[] parameters = {"hello", "Imooc"};
Observable observableFrom = Observable.from(parameters);
//第二步:創(chuàng)建觀察者
Observer<Object> observer = new Observer<Object>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Object s) {
}
};
public void doRxjava(){
//第三步:訂閱
observable.subscribe(observer);
}
}
參考自 慕課網(wǎng)