Rxjava2-小白入門(一)
前言
最近在學習Rxjava2,雖然在實際的專案中使用也看了很多的文章和文件同時也看了菜鳥窩Ivan老師的免費課程。,學會了如何使用但是忘記的很快,也沒有很好的總結,在學習的時做的筆記過了一段時間發現自己做的筆記都有些看不明白,作為小白的我寫部落格還是有點膽戰心驚的,這篇部落格的主要的目的是引導沒有了解過Rxjava的人一個參考,講一些簡單的原理和常用操作符及使用場景,可能會有錯誤希望大家多多指教批評,去其糟粕取其精華,那麼開始學習之旅吧。
概念
我們知道Rxjva使用的是觀察者設計模式,那麼什麼是觀察者模式呢?其實我們在開發中一直使用,只是我們沒用認真的去了解,常見按鈕點選事件就是一個很好的例子。也許現在你還疑惑那麼在我講解概念之後回頭在看你就會明白了。首先我們要先了解幾個概念。
- 什麼是觀察者模式?
觀察者(Observer)模式:是物件的行為模式,又叫做釋出-訂閱(Publish/Subscribe)模式、模型-檢視(Model/View)模式、源-監聽(Source/Listener)模式或者從屬(Dependents)模式。
抽象主題(Subject)角色:
抽象主題角色把所有對觀察者物件的引用儲存在一個聚集(比如ArrayList物件)裡,每個主題都可以有任何數量的觀察者。抽象主題提供一個介面,可以增加和刪除觀察者物件,抽象主題角色又叫做抽象被觀察者(Observable)角色。
具體主題(ConcreteSubject)角色:
將有關狀態存入具體觀察者物件;在具體主題的內部狀態改變時,給所有登記過的觀察者發出通知。具體主題角色又叫做具體被觀察者(Concrete Observable)角色。
抽象觀察者(Observer)角色:
為所有的具體觀察者定義一個介面,在得到主題的通知時更新自己,這個介面叫做更新介面。
具體觀察者(ConcreteObserver)角色:
儲存與主題的狀態自恰的狀態。具體觀察者角色實現抽象觀察者角色所要求的更新介面,以便使本身的狀態與主題的狀態 像協調。如果需要,具體觀察者角色可以保持一個指向具體主題物件的引用。
觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某一個主題物件,這個主題物件在狀態上發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。
這是一種比較官方的說法,當然每個人的理解不同。簡單來說在觀察者模式中,有兩個物件觀察者(訂閱)和被觀察者(被訂閱),一個被觀察者可以有很多觀察者,當被觀察者法神變化的時候,所有的觀察者都會收到通知,從而改變自己(更新自己)。舉個例子:一個課堂上,只會有一個老師(被觀察者)講課,當講到一個知識點,每個都同學(觀察者)聽到老師所講的知識點,有的會做筆記有的會提問(相當於所有觀察者接到通知改變自己)。這就是觀察者模式。
- 是觀察者模式圖形分析?
抽象主題(Subject)角色:
抽象主題角色把所有對觀察者物件的引用儲存在一個聚集(比如ArrayList物件)裡,每個主題都可以有任何數量的觀察者。抽象主題提供一個介面,可以增加和刪除觀察者物件,抽象主題角色又叫做抽象被觀察者(Observable)角色。
具體主題(ConcreteSubject)角色:
將有關狀態存入具體觀察者物件;在具體主題的內部狀態改變時,給所有登記過的觀察者發出通知。具體主題角色又叫做具體被觀察者(Concrete Observable)角色。
抽象觀察者(Observer)角色:
為所有的具體觀察者定義一個介面,在得到主題的通知時更新自己,這個介面叫做更新介面。
具體觀察者(ConcreteObserver)角色:
儲存與主題的狀態自恰的狀態。具體觀察者角色實現抽象觀察者角色所要求的更新介面,以便使本身的狀態與主題的狀態 像協調。如果需要,具體觀察者角色可以保持一個指向具體主題物件的引用。
從這個關係圖我們可以看出左側是被觀察者(Subject/Observable),右側是觀察者(Observer),他們的關係是1-0..*(1對多的關係)。被觀察者通過集合管理觀察者,並且有三個方法:attach()繫結(add()加入集合) detached()解綁(remove()移除集合) notifiyObeserver()通知所有的觀察者(遍歷集合呼叫updata()方法)。
明白了關係圖那麼我們通過程式碼來實際運用下加深理解:
/**
* 觀察者
*/
public interface Observer {
void upData(String state);
}
首先我們建立一個觀察者,他只用一個方法upData(String state);更新狀態。我們在建立兩個類來繼承它。
public class TomObserver implements Observer{
@Override
public void upData(String state) {
/*
* 在這裡我們根據接受到state做相應的處理
*/
System.out.println("我是Tom 我在"+state);
}
}
public class JackObserver implements Observer{
@Override
public void upData(String state) {
/*
* 在這裡我們根據接受到state做相應的處理
*/
System.out.println("我是Jack 我在"+state);
}
}
在這裡我們建立2個觀察者子類Tom和Jack。實現upData()並根據介紹到的state做相應的處理,這裡我們只是簡單的列印接到資訊。觀察者建立完成我們在建立被觀察者(Subject/Observable)。
/**
*被觀察者
*/
public abstract class Observable {
List<Observer> list=new ArrayList<>();
/*
* 繫結觀察者
*/
public void attach(Observer observer){
list.add(observer);
System.out.println("繫結觀察者"+observer.getClass().getSimpleName());
}
/*
* 解綁觀察者
*/
public void detach(Observer observer){
list.remove(observer);
System.out.println("解綁被觀察者"+observer.getClass().getSimpleName());
}
/*
* 通知所有觀察者
*/
public void notifyObservers(String state){
for (Observer observer : list) {
observer.upData(state);
}
}
}
這段程式碼也很容易理解,就是和上面我們的關係圖一樣被觀察者通過集合管理觀察者。通過繫結新增,解綁移除,notifyObservers()通知所有觀察者。我們在建立一個他的子類。
public class MessageOberver extends Observable{
public void change(String state){
notifyObservers(state);
}
}
建立子類的,其實它就做了一件事就是呼叫父類的notifyObservers()方法。
好了。現在所有的準備工作我們已經做好了讓我們來實際操作一下,到底是怎麼運作的。
public class Test {
public static void main(String[] args) {
Observer jObserver=new JackObserver();
Observer tObserver=new TomObserver();
MessageOberver oberver=new MessageOberver();
oberver.attach(jObserver);
oberver.attach(tObserver);
oberver.change("打籃球");
oberver.detach(tObserver);
oberver.change("跑步");
}
}
這段程式碼我們先建立2個Observer(觀察者)例項,再建立MessageOberver(被觀察者)通過attach()繫結,當我們被觀察者(再建立MessageOberver),狀態改變(“打籃球”)看看會發生什麼?
繫結觀察者JackObserver
繫結觀察者TomObserver
我是Jack 我正在打籃球
我是Tom 我正在打籃球
解綁被觀察者TomObserver
我是Jack 我正在跑步
可以看到當我們的被觀察者狀態改變要去打籃球的時候,所有他的觀察者(也就是attach()繫結的物件)都能接到資訊,當我們解綁的後解綁的觀察者就不能在接到資訊了。這就是我們的觀察者模式。其實這麼看來還是挺簡單的。
在理解了觀察者模式後我們在回到文章開始的時候提到的android中用的觀察者模式比如點選事件,放到我們寫的例子中我們應該怎麼去理解呢?
public class Test {
public static void main(String[] args) {
Observer jObserver=new JackObserver();
Observer tObserver=new TomObserver();
MessageOberver oberver=new MessageOberver();
/*
* oberver相當於Button
* attach相當與setOnclickListener
* jObserver相當於 OnclickListener
* change方法就是我們在監聽中對應的要做的事情(這裡我們是呼叫notifyObservers(),
* 它的內部是呼叫每個oberver的updata方法 我們可以在updata方法中做不同的處理)
*/
oberver.attach(jObserver);
oberver.attach(tObserver);
oberver.change("打籃球");
oberver.detach(tObserver);
oberver.change("跑步");
}
}
看了我的註釋在結合平時我們寫的程式碼是不是有一種不約而同的感覺呢。那麼在實際開發中我們又在那裡用到觀察者模式呢?簡單的例子。其實在實際專案中我們想讓多個介面監聽一個物件的狀態變化時我們就可以用到觀察者模式。比如常見的下載應用我隨便找的兩個截圖
這是我們常見手機應用軟體的截圖這是兩個不同的頁面,2個頁面下載進度同步,其實我們就可以使用觀察者模式,下載任務為被觀察者頁面(Activity或者Fragment)為觀察者(實現介面,引數將String state 該改成DownInfo info下載任務)那麼當下載進度改變時我們實時跟新狀態,那麼兩個頁面的進度同步啦,比如音樂播放進度等根據業務要求觀察者設計模式有時會幫助我們解決不少場景需要。
結語
這篇文章主要是講解什麼觀察者模式,雖然本文是Rxjava小白入門,但是講下觀察者模式還是有必要的。雖然網上也有很多講解,有的講的太深,有的講的太多,並不是他們說的不好,而是身為小白的我去讀太深的東西讓我難以記住和理解,希望這篇文對你有所幫助。下篇文章我會簡單講解下java中的觀察者模式和Rxjava的簡單使用。