天天看點

RxJava簡單改造執行個體: BehaviorSubject簡化資料和界面的同步流程

面向RxJava初學者,一個簡單的RxJava優化傳統流程/精簡代碼的例子。

使用BehaviorSubject簡化資料和界面的同步流程:

  • 有這樣的常見場景: 程式啟動時就會去遠端/本地讀取資料,而與此同時,與這份資料關聯的界面也會在某個時刻被啟動。
    • 顯然這是一個關于并行的問題,讀取資料本身是一個異步的行為,其傳回的時刻是不可預期的,界面啟動很多時候完全取決于使用者的操作,是以其啟動時刻也是不可預期的。
    • 解決問題的思路很樸素,界面啟動時,嘗試去對應的資料實體擷取資料,如果這個時候資料已經回來,那麼擷取并展示即可。如果資料還沒有回來,那麼界面需要某種途徑來實作對資料的監聽,進而在資料RxJava回時可以及時的重新整理界面。
    • 有了上述思路,我們完全可以自己寫一個Repository(第一版):
      • Repository内部會維護一份目前最新資料,并提供對這份資料的查詢接口。
      • Repository還需要提供一個監聽接口,在資料變化時通知監聽者。
      • Repository本身還肩負着從遠端/本地讀取資料的職責和功能。
      • 如何使用? 使用者先通過查詢接口獲得目前最新的資料(如果有的話),然後注冊監聽來關注下一步的資料變化。這樣做顯然很笨拙,使用者調了2個接口,而其實一個接口就可以
    • Repository(第二版):
      • Repository内部會維護一份目前最新資料。
      • Repository還需要提供一個監聽接口,在資料變化時通知監聽者。并且在監聽者開始監聽時,如果目前有cache的最新資料,那麼将這份資料投遞給監聽者。
      • Repository本身還肩負着從遠端/本地讀取資料的職責和功能。
      • 如何使用? 使用者注冊監聽, 如果之前就已經有資料從遠端/本地提取出來,那麼就可以立刻觸發一個回調來擷取這份資料。這個改進思路很簡單,但是提高了便利。不過,我很還是要自己寫這個内部流程對不對?好麻煩
    • Repository(第三版):
      • 首先要知曉BehaviorSubject的特性:
        • BehaviorSubject屬于hot Observable, 使用者調用其onXXX方法就可以主動的開始一條消息流而無需依賴Subscriber的subscribe。
        • 另外一個重要特性是:BehaviorSubject内部會cache消息流的最近一個消息, 在後續有Subscriber進行subscribe時,會直接将此cache的消息投遞給Subsciber。
      • 你會發現BehaviorSubject簡直是為上述這個資料同步流程量身打造的,因為RxJava中的幾種Subject都針對的某一種常見應用場景。
      • Repository本身還肩負着從遠端/本地讀取資料的職責和功能。
      • 我們的Repository很好寫了: 内部除了遠端/本地讀取資料功能外,就隻需要維護一個BehaviorSubject即可,有新資料來,調用其onNext進行投遞。BehaviorSubject本身又提供了監聽和通知,新使用者監聽,會投遞cache的最新資料