在线二区人妖系列_国产亚洲欧美日韩在线一区_国产一级婬片视频免费看_精品少妇一区二区三区在线

鍍金池/ 教程/ Android/ ReactiveX
調(diào)度器 Scheduler
Empty/Never/Throw
Replay
這個頁面展示了創(chuàng)建Observable的各種方法。
ObserveOn
ReactiveX
TimeInterval
Window
本頁展示的操作符用于對整個序列執(zhí)行算法操作或其它操作,由于這些操作必須等待數(shù)據(jù)發(fā)射完成(通常也必須緩存這些數(shù)據(jù)),它們對于非常長
IgnoreElements
Distinct
Last
Start
And/Then/When
Switch
創(chuàng)建操作
Materialize/Dematerialize
CombineLatest
Catch
實現(xiàn)自己的操作符
StringObservable
Map
ConnectableObservable
Using
Take
BlockingObservable
TakeLast
Defer
RxJavaSchedulersHook
First
FlatMap
這個頁面的操作符可用于根據(jù)條件發(fā)射或變換Observables,或者對它們做布爾運算:
Do
Repeat
Serialize
這個頁面展示的操作符可用于過濾和選擇Observable發(fā)射的數(shù)據(jù)序列。
這個頁面列出了很多用于Observable的輔助操作符
Single
Retry
從錯誤中恢復(fù)的技術(shù)
Sample
Merge
算術(shù)和聚合操作
Range
Timestamp
RxJava Issues
From
Subscribe
Subject
Delay
Skip
SubscribeOn
Filter
按字母順序排列的全部操作符列表
Timeout
Scan
onError
Zip
RxJava文檔和教程
Publish
ElementAt
第一個例子
SkipLast
Just
Timer
Debounce
GroupBy
條件和布爾操作
這個頁面展示了可用于對Observable發(fā)射的數(shù)據(jù)執(zhí)行變換操作的各種操作符。
Introduction
rxjava-async
介紹響應(yīng)式編程
這個頁面展示的操作符可用于組合多個Observables。
ReactiveX
Connect
操作符分類
StartWith
Interval
Join
To
Buffer
RefCount
介紹
Observable

ReactiveX

http://reactivex.io/intro.html

Rx介紹

ReactiveX的歷史

ReactiveX是Reactive Extensions的縮寫,一般簡寫為Rx,最初是LINQ的一個擴展,由微軟的架構(gòu)師Erik Meijer領(lǐng)導(dǎo)的團隊開發(fā),在2012年11月開源,Rx是一個編程模型,目標是提供一致的編程接口,幫助開發(fā)者更方便的處理異步數(shù)據(jù)流,Rx庫支持.NET、JavaScript和C++,Rx近幾年越來越流行了,現(xiàn)在已經(jīng)支持幾乎全部的流行編程語言了,Rx的大部分語言庫由ReactiveX這個組織負責(zé)維護,比較流行的有RxJava/RxJS/Rx.NET,社區(qū)網(wǎng)站是 reactivex.io

什么是ReactiveX

微軟給的定義是,Rx是一個函數(shù)庫,讓開發(fā)者可以利用可觀察序列和LINQ風(fēng)格查詢操作符來編寫異步和基于事件的程序,使用Rx,開發(fā)者可以用Observables表示異步數(shù)據(jù)流,用LINQ操作符查詢異步數(shù)據(jù)流, 用Schedulers參數(shù)化異步數(shù)據(jù)流的并發(fā)處理,Rx可以這樣定義:Rx = Observables + LINQ + Schedulers。

ReactiveX.io給的定義是,Rx是一個使用可觀察數(shù)據(jù)流進行異步編程的編程接口,ReactiveX結(jié)合了觀察者模式、迭代器模式和函數(shù)式編程的精華。

ReactiveX的應(yīng)用

很多公司都在使用ReactiveX,例如Microsoft、Netflix、Github、Trello、SoundCloud。

ReactiveX宣言

ReactiveX不僅僅是一個編程接口,它是一種編程思想的突破,它影響了許多其它的程序庫和框架以及編程語言。

Rx模式

使用觀察者模式

  • 創(chuàng)建:Rx可以方便的創(chuàng)建事件流和數(shù)據(jù)流
  • 組合:Rx使用查詢式的操作符組合和變換數(shù)據(jù)流
  • 監(jiān)聽:Rx可以訂閱任何可觀察的數(shù)據(jù)流并執(zhí)行操作

簡化代碼

  • 函數(shù)式風(fēng)格:對可觀察數(shù)據(jù)流使用無副作用的輸入輸出函數(shù),避免了程序里錯綜復(fù)雜的狀態(tài)
  • 簡化代碼:Rx的操作符通通??梢詫?fù)雜的難題簡化為很少的幾行代碼
  • 異步錯誤處理:傳統(tǒng)的try/catch沒辦法處理異步計算,Rx提供了合適的錯誤處理機制
  • 輕松使用并發(fā):Rx的Observables和Schedulers讓開發(fā)者可以擺脫底層的線程同步和各種并發(fā)問題

使用Observable的優(yōu)勢

Rx擴展了觀察者模式用于支持數(shù)據(jù)和事件序列,添加了一些操作符,它讓你可以聲明式的組合這些序列,而無需關(guān)注底層的實現(xiàn):如線程、同步、線程安全、并發(fā)數(shù)據(jù)結(jié)構(gòu)和非阻塞IO。

Observable通過使用最佳的方式訪問異步數(shù)據(jù)序列填補了這個間隙

單個數(shù)據(jù) 多個數(shù)據(jù)
同步 T getData() Iterable<T> getData()
異步 Future<T> getData() Observable<T> getData()

Rx的Observable模型讓你可以像使用集合數(shù)據(jù)一樣操作異步事件流,對異步事件流使用各種簡單、可組合的操作。

Observable可組合

對于單層的異步操作來說,Java中Future對象的處理方式是非常簡單有效的,但是一旦涉及到嵌套,它們就開始變得異常繁瑣和復(fù)雜。使用Future很難很好的組合帶條件的異步執(zhí)行流程(考慮到運行時各種潛在的問題,甚至可以說是不可能的),當(dāng)然,要想實現(xiàn)還是可以做到的,但是非常困難,或許你可以用Future.get(),但這樣做,異步執(zhí)行的優(yōu)勢就完全沒有了。從另一方面說,Rx的Observable一開始就是為組合異步數(shù)據(jù)流準備的。

Observable更靈活

Rx的Observable不僅支持處理單獨的標量值(就像Future可以做的),也支持數(shù)據(jù)序列,甚至是無窮的數(shù)據(jù)流。Observable是一個抽象概念,適用于任何場景。Observable擁有它的近親Iterable的全部優(yōu)雅與靈活。

Observable是異步的雙向push,Iterable是同步的單向pull,對比:

事件 Iterable(pull) Observable(push)
獲取數(shù)據(jù) T next() onNext(T)
異常處理 throws Exception onError(Exception)
任務(wù)完成 !hasNext() onCompleted()

Observable無偏見

Rx對于對于并發(fā)性或異步性沒有任何特殊的偏好,Observable可以用任何方式實現(xiàn),線程池、事件循環(huán)、非阻塞IO、Actor模式,任何滿足你的需求的,你擅長或偏好的方式都可以。無論你選擇怎樣實現(xiàn)它,無論底層實現(xiàn)是阻塞的還是非阻塞的,客戶端代碼將所有與Observable的交互都當(dāng)做是異步的。

Observable是如何實現(xiàn)的?

public Observable<data> getData();
  • 它能與調(diào)用者在同一線程同步執(zhí)行嗎?
  • 它能異步地在單獨的線程執(zhí)行嗎?
  • 它會將工作分發(fā)到多個線程,返回數(shù)據(jù)的順序是任意的嗎?
  • 它使用Actor模式而不是線程池嗎?
  • 它使用NIO和事件循環(huán)執(zhí)行異步網(wǎng)絡(luò)訪問嗎?
  • 它使用事件循環(huán)將工作線程從回調(diào)線程分離出來嗎?

從Observer的視角看,這些都無所謂,重要的是:使用Rx,你可以改變你的觀念,你可以在完全不影響Observable程序庫使用者的情況下,徹底的改變Observable的底層實現(xiàn)。

使用回調(diào)存在很多問題

回調(diào)在不阻塞任何事情的情況下,解決了Future.get()過早阻塞的問題。由于響應(yīng)結(jié)果一旦就緒Callback就會被調(diào)用,它們天生就是高效率的。不過,就像使用Future一樣,對于單層的異步執(zhí)行來說,回調(diào)很容易使用,對于嵌套的異步組合,它們顯得非常笨拙。

Rx是一個多語言的實現(xiàn)

Rx在大量的編程語言中都有實現(xiàn),并尊重實現(xiàn)語言的風(fēng)格,而且更多的實現(xiàn)正在飛速增加。

響應(yīng)式編程

Rx提供了一系列的操作符,你可以使用它們來過濾(filter)、選擇(select)、變換(transform)、結(jié)合(combine)和組合(compose)多個Observable,這些操作符讓執(zhí)行和復(fù)合變得非常高效。

你可以把Observable當(dāng)做Iterable的推送方式的等價物,使用Iterable,消費者從生產(chǎn)者那拉取數(shù)據(jù),線程阻塞直至數(shù)據(jù)準備好。使用Observable,在數(shù)據(jù)準備好時,生產(chǎn)者將數(shù)據(jù)推送給消費者。數(shù)據(jù)可以同步或異步的到達,這種方式更靈活。

下面的例子展示了相似的高階函數(shù)在Iterable和Observable上的應(yīng)用

// Iterable
getDataFromLocalMemory()
  .skip(10)
  .take(5)
  .map({ s -> return s + " transformed" })
  .forEach({ println "next => " + it })

// Observable
getDataFromNetwork()
  .skip(10)
  .take(5)
  .map({ s -> return s + " transformed" })
  .subscribe({ println "onNext => " + it })

Observable類型給GOF的觀察者模式添加了兩種缺少的語義,這樣就和Iterable類型中可用的操作一致了:

  1. 生產(chǎn)者可以發(fā)信號給消費者,通知它沒有更多數(shù)據(jù)可用了(對于Iterable,一個for循環(huán)正常完成表示沒有數(shù)據(jù)了;對于Observable,就是調(diào)用觀察者的onCompleted方法)
  2. 生產(chǎn)者可以發(fā)信號給消費者,通知它遇到了一個錯誤(對于Iterable,迭代過程中發(fā)生錯誤會拋出異常;對于Observable,就是調(diào)用觀察者(Observer)的onError方法)

有了這兩種功能,Rx就能使Observable與Iterable保持一致了,唯一的不同是數(shù)據(jù)流的方向。任何對Iterable的操作,你都可以對Observable使用。

名詞定義

這里給出一些名詞的翻譯

  • Reactive 直譯為反應(yīng)性的,有活性的,根據(jù)上下文一般翻譯為反應(yīng)式、響應(yīng)式
  • Iterable 可迭代對象,支持以迭代器的形式遍歷,許多語言中都存在這個概念
  • Observable 可觀察對象,在Rx中定義為更強大的Iterable,在觀察者模式中是被觀察的對象,一旦數(shù)據(jù)產(chǎn)生或發(fā)生變化,會通過某種方式通知觀察者或訂閱者
  • Observer 觀察者對象,監(jiān)聽Observable發(fā)射的數(shù)據(jù)并做出響應(yīng),Subscriber是它的一個特殊實現(xiàn)
  • emit 直譯為發(fā)射,發(fā)布,發(fā)出,含義是Observable在數(shù)據(jù)產(chǎn)生或變化時發(fā)送通知給Observer,調(diào)用Observer對應(yīng)的方法,文章里一律譯為發(fā)射
  • items 直譯為項目,條目,在Rx里是指Observable發(fā)射的數(shù)據(jù)項,文章里一律譯為數(shù)據(jù),數(shù)據(jù)項
上一篇:Using下一篇:StartWith