1. 程式人生 > >RxJava開發精要1-從.NET到RxJava

RxJava開發精要1-從.NET到RxJava

RX - 從.NET到RxJava

響應式程式設計是一種基於非同步資料流概念的程式設計模式。資料流就像一條河:它可以被觀測,被過濾,被操作,或者為新的消費者與另外一條流合併為一條新的流。

響應式程式設計的一個關鍵概念是事件。事件可以被等待,可以觸發過程,也可以觸發其它事件。事件是唯一的以合適的方式將我們的現實世界對映到我們的軟體中:如果屋裡太熱了我們就開啟一扇窗戶。同樣的,當我們更改電子錶(變化的傳播)中的一些數值時,我們需要更新整個表格或者我們的機器人碰到牆時會轉彎(響應事件)。

今天,響應式程式設計最通用的一個場景是UI:我們的移動App必須做出對網路呼叫、使用者觸控輸入和系統彈框的響應。在這個世界上,軟體之所以是事件驅動並響應的是因為現實生活也是如此。

微軟響應式擴充套件

函式響應式程式設計是一個來自90年代後期受微軟的一名電腦科學家Erik Meijer啟發的思想,用來設計和開發微軟的Rx庫。

Rx 是微軟.NET的一個響應式擴充套件。Rx藉助可觀測的序列提供一種簡單的方式來建立非同步的,基於事件驅動的程式。開發者可以使用Observables模擬非同步資料流,使用LINQ語法查詢Observables,並且很容易管理排程器的併發。

Rx讓眾所周知的概念變得易於實現和消費,例如push方法。在響應式的世界裡,我們不能假裝作使用者不關注或者是不抱怨它而一味的等待函式的返回結果,網路呼叫,或者資料庫查詢的返回結果。我們時刻都在等待某些東西,這就讓我們失去了並行處理其他事情的機會,提供更好的使用者體驗,讓我們的軟體免受順序鏈的影響,而阻塞程式設計。

下表列出的與.NET 列舉相關的.NET Observable

.NET Observable 一個返回值 多個返回值
Pull/Synchronous/Interactive T IEnumerable<T>
Push/Asynchronous/Reactive Task<T> IObservable<T>

push方法把這個問題逆轉了:取而代之的是不再等待結果,開發者只是簡單的請求結果,而當它返回時得到一個通知即可。開發者對即將發生的事件提供一個清晰的響應鏈。對於每一個事件,開發者都作出相應的響應;例如,使用者被要求登入的時候,提交一個攜帶他的使用者名稱和密碼的表單。應用程式執行登入的網路請求,接下來將要發生的情況有:

  • 顯示一個成功的資訊,並儲存使用者的個人資訊。
  • 顯示一個錯誤的資訊

正如你用push方法所看到的,開發者不需要等待結果。而是在結果返回時通知他。在這期間,他可以做他想做的任何事情:

  • 顯示一個進度對話方塊
  • 為下次登入儲存使用者名稱和密碼
  • 預載入一些他認為登入成功後需要耗時處理的事情

來到Java世界 - Netflix RxJava

Netflix在2012年開始意識到他們的架構要滿足他們龐大的使用者群體已經變得步履維艱。因此他們決定重新設計架構來減少REST呼叫的次數。取代幾十次的REST呼叫,而是讓客戶端自己處理需要的資料,他們決定基於客戶端需求建立一個專門優化過的REST呼叫。

為了實現這一目標,他們決定嘗試響應式,開始將.NET Rx遷移到JVM上面。他們不想只基於Java語言;而是整個JVM,從而有可能為市場上的每一種基於JVM的語言:如Java、Closure、Groovy、Scala等等提供一種新的工具。

2013年二月份,Ben Christensen 和 Jafar Husain發在Netflix技術部落格的一篇文章第一次向世界展示了RxJava。

主要特點有:

  • 易於併發從而更好的利用伺服器的能力。
  • 易於有條件的非同步執行。
  • 一種更好的方式來避免回撥地獄。
  • 一種響應式方法。

正如.NET,RxJava Observable 是push 迭代的等價體,即pull。pull方法是阻塞並等待的方法:消費者從源頭pull值,並阻塞執行緒直到生產者提供新的值。

push方法作用於訂閱和響應:消費者訂閱新值的發射,當它們可用時生產者push這些新值並通知消費者。在這一點上,消費者消費了它們。push方法很明顯更靈活,因為從邏輯和實踐的觀點來看,開發者只需忽略他需要的資料是來自同步還是非同步;他的程式碼將仍然起作用。

RxJava的與眾不同之處

從純Java的觀點看,RxJava Observable類源自於經典的Gang Of Four的觀察者模式。

它添加了三個缺少的功能:

  • 生產者在沒有更多資料可用時能夠發出訊號通知:onCompleted()事件。
  • 生產者在發生錯誤時能夠發出訊號通知:onError()事件。
  • RxJava Observables 能夠組合而不是巢狀,從而避免開發者陷入回撥地獄。

Observables和Iterables共用一個相似的API:我們在Iterable可以執行的許多操作也都同樣可以在Observables上執行。當然,由於Observables流的本質,沒有如Iterable.remove()這樣相應的方法。

Pattern 一個返回值 多個返回值
Synchronous T getData() Iterable<T>
Asynchronous Future<T> getData() Observable<T> getData()

從語義的角度來看,RxJava就是.NET Rx。從語法的角度來看,Netflix考慮到了對應每個Rx方法,保留了Java程式碼規範和基本的模式。

總結

本章中,我們初步探索了響應式的世界。從微軟的.NET到Netflix的RxJava,我們瞭解了Rx是如何誕生的,我們也瞭解到傳統的方法與響應式方法相比之間的相似和不同。

下一章,我們將學習到Observables是什麼,以及如何建立它並把響應式程式設計應用到我們的日常編碼中去。

相關推薦

RxJava開發1-.NET到RxJava

RX - 從.NET到RxJava 響應式程式設計是一種基於非同步資料流概念的程式設計模式。資料流就像一條河:它可以被觀測,被過濾,被操作,或者為新的消費者與另外一條流合併為一條新的流。 響應式程式設計的一個關鍵概念是事件。事件可以被等待,可以觸發過程,

RxJava開發6

上一章中,我們學到如何轉換可觀測序列。我們也看到了map(),scan(),groupBY(),以及更多有用的函式的實際例子,它們幫助我們操作Observable來建立我們想要的Observable。 本章中,我們將研究組合函式並學習如何同時處理多個Obs

ChainDesk|0到1:Hyperledger Fabric開發-安裝Fabric

  作者:ChainDesk韓小東,ChainDesk區塊鏈行業分析師, ChainDesk區塊鏈工程師 孔壹學院今日搞活動,限時5折,快來學習吧 目標 順利下載Hyperledger Fabric 明確bootstrap.sh指令碼做了哪些事 任務實

ChainDesk : 0 到 1-Hyperledger Fabric 開發

第一章:第 1 章 Hyperledger Fabric 的認知與環境搭建  第一節:妙談超級賬本之前世今生  http://www.chaindesk.cn/witbook/11/97?20181229csdn  第二節:邁出第一步:做好提前準備&n

php面向對象(1)

new abstract self () elf span truct nim enum 1、靜態屬性與方法 每一個類的實例擁有自己的屬性和方法,每一個類也可以包含靜態屬性,靜態屬性不屬於類的任何實例,可以把靜態屬性理解成存儲在類中的全局變量,可以在任何地方通過類名引用靜

ChainDesk|Hyperledger Fabric開發|測試Fabric網路環境

​ 區塊鏈技術QQ交流群:263270946 掌握更多技術乾貨,關注微信公眾號“ChainDesk”      作者:ChainDesk韓小東,ChainDesk區塊鏈行業分析師, ChainDesk區塊鏈工程師 ChainDesk官網

一款APP的開發設計是如何0到1一步一步設計的

容易 學習 nbsp 過程 很快 idt 工具 strong fail 目前在行業裏,關於APP界面設計規範也是層次不齊,很多都還停留在6的設備和ios 9的系統之上,而現在最新的是iphone 7和iOS 10了(更新換代真的很快),我這裏說的是最新的iOS 界面設計

零開始搭建微信硬件開發環境全過程——1小時掌握微信硬件開發流程

sdn 流程 第三方服務 ota 必須 air 開發板 port pen 筆者決定在嵌入式企鵝圈2016年的首篇文章中,發表微信硬件物聯領域極具實踐價值的文章,它將

獲取深度和法線紋理 背後的原理【Unity Shader入門13.1.1

  13.1.1背後的原理 什麼是深度紋理: 實際上就是一張渲染紋理,只不過它裡面儲存的畫素值不是顏色值,而是一個高精度的深度值,由於被儲存在一張紋理中,深度紋理裡的深度範圍是[0,1],而且通常是 非線性分佈的。 深度值來自頂點變換後得到的歸一化的裝置座標(Normali

卡通風格的渲染【Unity Shader入門14.1

卡通渲染的方法之一:基於色調的著色技術(tone-based shading)。P288 實現中,我們往往會使用 漫反射係數 對一張一維紋理進行取樣,以控制漫反射的色調 。(7.3節中用漸變紋理實現過這種效果) 卡通風格的高光往往是一塊分界明顯的純色區域。 除了光照模型不同外,卡通風格通

軟體工程概述1-概述

拒絕囉裡八嗦的廢話,坑爹不是時間,是青春. 1.      軟體工程定義: 軟體工程是1968年北大西洋公約組織的工作會議上首先提出“軟體工程”的概念,要用工程化的思想來開發軟體.用科學知識和技術原理來定義、開發、維護軟體的一 門科學 1.1軟體工程的性質: 軟體工程是一門

軟體設計與模式--筆記1

一:面向物件的核心要素封裝(Encapsulation)、繼承(Inheritance)、多型(Polymorphism)1.封裝封裝就是合理的隱藏和公開。In computer science, information hiding is the principle of segregation of th

Ubuntu14下Hadoop開發&lt;1&gt; 基礎環境安裝

oot jar包 臺式機 解壓 span ice href 安裝samba lan 準備了一臺淘汰的筆記本。單核CPU。3G內存。160G硬盤;準備一個2G的U盤在官網下載了64位的14.04版本號(麒麟)的ISO。下載UNetbootin(Ubuntu專用U盤安裝工

[大數據]-Elasticsearch5.3.1+Kibana5.3.1單機到分布式的安裝與使用<2>

amp fault hang 終端 bject pre 定義 地理 類型 前言:上篇[大數據]-Elasticsearch5.3.1+Kibana5.3.1從單機到分布式的安裝與使用<1>中介紹了ES ,Kibana的單機到分布式的安裝,這裏主要是介紹Elast

Javaweb之 servlet 開發具體解釋1

tom action fig 優先 sync exc http響應 write model 1.1 Tip:Servlet簡單介紹 Servlet是sun公司提供的一門用於開發動態web資源的技術。 Sun公司在其API中提供了一個servlet接口,用戶若想用發一個

1.GUI到MVC

interface 成對 復雜 del 網絡 用戶圖形界面 mod 事件 界面   GUI(graphic user interface 用戶圖形界面)。GUI編程的目的是提供交互性,並根據用戶的操作實時的更新界面。用戶的操作是不可預知的鼠標和鍵盤事件,我們如何保持同步和更

cocos2dx 3.1零學習(二)——菜單、場景切換、場景傳值

天空 ptr select 特效 new 要點 綁定 使用 water 回想一下上一篇的內容,我們已經學會了創建一個新的場景scene,加入sprite和label到層中。掌握了定時事件schedule。我們能夠順利的寫出打飛機的主場景框架。 上一篇的內容我練習了七個新

筆記 屬性 權限 用戶 臨時權限(猿課1.6-2.0)

linux1.6 文件或目錄屬性信息ls -l 看目錄的詳細信息- 普通文件 d 目錄 s 進程間通信 c 字符設備 b 塊設備 l 軟連接(快捷方式) p管道文件所屬主 所屬組 其他人 權限rwxls -li inode號ls -la 111 有兩個子目錄 ls -lh 根據文件大小更改單位1.7 chmo

2.Erlang語言

類型 數據類型 生存 help 技巧 使用 函數 lang 小技巧 ?與Erlang shell交互 ?數據類型、模型、函數與代碼編譯 ?單賦值變量與模式匹配 ?Erlang語言生存指南 ?如何運用遞歸來編程 Erlang shell使用小技巧 help().

[轉]Jetson TX1 開發教程(1)配置與刷機

uda 密碼 隨著 賬號 自己 一個 路由器 b- 出廠 開箱 Jetson TX1是英偉達公司新出的GPU開發板,擁有世界上先進的嵌入式視覺計算系統,提供高性能、新技術和極佳的開發平臺。在進行配置和刷機工作之前,先來一張全家福: 可以看到,Jetson TX1 包含內容