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("跑步");

    }
}

看了我的註釋在結合平時我們寫的代碼是不是有一種不約而同的感覺呢。那麼在實際開發中我們又在那裏用到觀察者模式呢?簡單的例子。其實在實際項目中我們想讓多個界面監聽一個對象的狀態變化時我們就可以用到觀察者模式。比如常見的下載應用我隨便找的兩個截圖

image

image

這是我們常見手機應用軟件的截圖這是兩個不同的頁面,2個頁面下載進度同步,其實我們就可以使用觀察者模式,下載任務爲被觀察者頁面(Activity或者Fragment)爲觀察者(實現接口,參數將String state 該改成DownInfo info下載任務)那麼當下載進度改變時我們實時跟新狀態,那麼兩個頁面的進度同步啦,比如音樂播放進度等根據業務要求觀察者設計模式有時會幫助我們解決不少場景需要。

結語

這篇文章主要是講解什麼觀察者模式,雖然本文是Rxjava小白入門,但是講下觀察者模式還是有必要的。雖然網上也有很多講解,有的講的太深,有的講的太多,並不是他們說的不好,而是身爲小白的我去讀太深的東西讓我難以記住和理解,希望這篇文對你有所幫助。下篇文章我會簡單講解下java中的觀察者模式和Rxjava的簡單使用。

發佈了33 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章