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的最新數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章