Android 響應式程式設計 RxJava2 完全解析
使用了 RxJava2 有一段時間了,深深感受到了其“牛逼”之處。下面,就從 RxJava2 的基礎開始,一步步與大家分享一下這個強大的非同步庫的用法!RxJava 是 一個在 Java VM 上使用可觀測的序列來組成非同步的、基於事件的程式的庫,也就是用於實現非同步操作的庫。
1.RxJava2 基礎
RxJava可以濃縮為非同步兩個字,其核心的東西不外乎兩個, Observables(被觀察者) 和 Observable(觀察者)。Observables可以發出一系列的 事件(例如網路請求、複雜計算、資料庫操作、檔案讀取等),事件執行結束後交給Observable 的回撥處理。
1.RxJava2 的觀察者模式
觀察者模式是物件的行為模式,也叫做釋出-訂閱(Publish/Subscribe)模式、模型-檢視(Model/View)模式、源-監聽器(Source/Listener)模式或從屬者(Dependents)模式。
什麼是觀察者模式?舉個栗子,Android中View的點選監聽器的實現,View是被觀察者,OnClickListener物件是觀察者,Activity要如何知道View被點選了?那就是派一個OnClickListener物件,入駐View,與View達成一個訂閱關係,一旦View被點選了,就通過OnClickListener物件的OnClick方法傳達給Activity。採用觀察者模式可以避免去輪詢檢查,節約有限的cpu資源。
RxJava 作為一個工具庫,使用的便是通用形式的觀察者模式:
普通事件:onNext(),相當於 onClick()、onEvent();特殊事件:onCompleted() 和 onError()
如圖所示,RxJava 的基本概念分別為:Observable(被觀察者,事件源),Observer(觀察者,訂閱者),subscribe (訂閱)、事件;不同的是,RxJava 把多個事件看做一個佇列,並對每個事件單獨處理。在一個佇列中 onCompleted() 和 onError(),只有一個會被呼叫。如果呼叫了 onCompleted() 就說明佇列執行完畢,沒有出現異常,否則呼叫 onError() 方法並終止佇列。
2.RxJava2 響應式程式設計結構
什麼是響應式程式設計?舉個栗子,a = b + c; 這句程式碼將b+c的值賦給a,而之後如果b和c的值改變了不會影響到a,然而,對於響應式程式設計,之後b和c的值的改變也動態影響著a,意味著a會隨著b和c的變化而變化。
響應式程式設計的組成為Observable/Operator/Subscriber,RxJava在響應式程式設計中的基本流程如下:
這個流程,可以簡單的理解為:Observable -> Operator1 -> Operator2 -> Operator3 -> Subscriber
- Observable發出一系列事件,他是事件的產生者;
- Subscriber負責處理事件,他是事件的消費者;
- Operator是對Observable發出的事件進行修改和變換;
- 若事件從產生到消費不需要其他處理,則可以省略掉中間的Operator,從而流程變為Obsevable -> Subscriber;
- Subscriber通常在主執行緒執行,所以原則上不要去處理太多的事務,而這些複雜的處理則交給Operator;
3.建立一個完整的 RxJava2 呼叫
首先需要新增 RxJava2 在 Android 中的 Gradle 依賴:
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile "io.reactivex.rxjava2:rxjava:2.0.8"
RxJava2 可以通過下面這幾種方法建立被觀察者:
// 傳送對應的方法
Observable.create(new ObservableOnSubscribe<String>() {
// 預設在主執行緒裡執行該方法
@Override
public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
e.onNext("Hello");
e.onNext("World");
// 結束標識
e.onComplete();
}
});
// 傳送多個數據
Observable.just("Hello", "World");
// 傳送陣列
Observable.fromArray("Hello", "World");
// 傳送一個數據
Observable.fromCallable(new Callable<String>() {
@Override
public String call() throws Exception {
return "Hello";
}
});
RxJava2 支援鏈式程式設計,下來我們建立被觀察者,然後建立觀察者並訂閱:
// 建立被觀察者
Observable.just("Hello", "World")
// 將被觀察者切換到子執行緒
.subscribeOn(Schedulers.io())
// 將觀察者切換到主執行緒
.observeOn(AndroidSchedulers.mainThread())
// 建立觀察者並訂閱
.subscribe(new Observer<String>() {
// Disposable 相當於RxJava1.x中的 Subscription,用於解除訂閱
private Disposable disposable;
@Override
public void onSubscribe(Disposable d) {
disposable = d;
}
@Override
public void onNext(String s) {
Log.i("JAVA", "被觀察者向觀察者傳送的資料:" + s);
if (s == "-1") { // "-1" 時為異常資料,解除訂閱
disposable.dispose();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
一旦 Observer 訂閱了 Observable,Observable 就會呼叫 Observer 的 onNext()、onCompleted()、onError() 等方法。至此一個完整的 RxJava 呼叫就完成了。看一下輸出的Log:
I/JAVA: 被觀察者向觀察者傳送的資料:Hello
I/JAVA: 被觀察者向觀察者傳送的資料:World
若喜歡簡潔、定製服務,那麼可以實現的方法跟上面的實現方法是對應起來的,大家看引數就知道哪個對應哪個了,你可以通過new Consumer(不需要實現的方法你可以不寫,看上去更簡潔),Consumer就是消費者的意思,可以理解為消費了 onNext 等事件:
Observable.just("Hello", "World")
.subscribe(new Consumer<String>() {
@Override
public void accept(@NonNull String s) throws Exception {
Log.i("JAVA", "被觀察者向觀察者傳送的資料:" + s);
}
}, new Consumer<Throwable>() {
@Override
public void accept(@NonNull Throwable throwable) throws Exception {
}
}, new Action() {
@Override
public void run() throws Exception {
}
}, new Consumer<Disposable>() {
@Override
public void accept(@NonNull Disposable disposable) throws Exception {
}
});
4.RxJava2 的操作符
RxJava中提供了大量不同種類,不同場景的Operators(操作符),RxJava的強大性就來自於它所定義的操作符。主要分類:
RxJava 的操作符 | 說明 | 例如 |
---|---|---|
建立操作 | 用於建立Observable的操作符 | create、defer、from、just、start、repeat、range |
變換操作 | 用於對Observable發射的資料進行變換 | buffer、window、map、flatMap、groupBy、scan |
過濾操作 | 用於從Observable發射的資料中進行選擇 | debounce、distinct、filter、sample、skip、take |
組合操作 | 用於將多個Observable組合成一個單一的Observable | and、startwith、join、merge、switch、zip |
異常處理 | 用於從錯誤通知中恢復 | catch、retry |
輔助操作 | 用於處理Observable的操作符 | delay、do、observeOn、subscribeOn、subscribe |
條件和布林操作 | all、amb、contains、skipUntil、takeUntil | |
演算法和聚合操作 | average、concat、count、max、min、sum、reduce | |
非同步操作 | start、toAsync、startFuture、FromAction、FromCallable、runAsync | |
連線操作 | connect、publish、refcount、replay | |
轉換操作 | toFuture、toList、toIterable、toMap、toMultiMap | |
阻塞操作 | forEach、first、last、mostRecent、next、single | |
字串操作 | byLine、decode、encode、from、join、split、stringConcat |
其中有一些高頻使用的操作符如下:
常用操作符 | 說明 |
---|---|
interval | 延時幾秒,每隔幾秒開始執行 |
take | 超過多少秒停止執行 |
map | 型別轉換 |
observeOn | 在主執行緒執行 |
doOnSubscribe | 在執行的過程中 |
subscribe | 訂閱 |
5.RxJava2 執行緒排程器
排程器 Scheduler 用於控制操作符和被觀察者事件所執行的執行緒,不同的排程器對應不同的執行緒。RxJava提供了5種排程器:
RxJava 執行緒排程器 | 說明 |
---|---|
Schedulers.immediate() | 預設執行緒,允許立即在當前執行緒執行所指定的工作。 |
Schedulers.newThread() | 新建執行緒,總是啟用新執行緒,並在新執行緒執行操作。 |
Schedulers.io() | 適用於I/O操作,根據需要增長或縮減來自適應的執行緒池。多數情況下 io() 比 newThread() 更有效率。不要把計算工作放在 io() 中,可以避免建立不必要的執行緒。 |
Schedulers.computation() | 適用於計算工作(CPU 密集型計算),即不會被 I/O 等操作限制性能的操作。這個 Scheduler 使用的固定的執行緒池,大小為 CPU 核數。不要把 I/O 操作放在 computation() 中,否則 I/O 操作的等待時間會浪費 CPU。 |
Schedulers.trampoline() | 當我們想在當前執行緒執行一個任務時,並不是立即,我們可以用.trampoline()將它入隊。這個排程器將會處理它的佇列並且按序執行佇列中每一個任務。 |
AndroidSchedulers.mainThread() | RxAndroid 提供的,它指定的操作將在 Android 主執行緒執行。 |
可以使用 subscribeOn() 和 ObserveOn() 操作符進行執行緒排程,讓 Observable 在一個特定的排程器上執行。subscribeOn() 指定 subscribe() 所發生的執行緒,事件產生的執行緒。ObserveOn() 指定 Observer 所執行在的執行緒,事件消費的執行緒。
6.RxJava2 模擬傳送驗證碼倒計時功能:
public void onCodeClick() {
final long count = 60; // 設定60秒
Observable.interval(0, 1, TimeUnit.SECONDS)
.take(count + 1)
.map(new Function<Long, Long>() {
@Override
public Long apply(@NonNull Long aLong) throws Exception {
return count - aLong; // 由於是倒計時,需要將倒計時的數字反過來
}
})
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(new Consumer<Disposable>() {
@Override
public void accept(@NonNull Disposable disposable) throws Exception {
button.setEnabled(false);
button.setTextColor(Color.GRAY);
}
})
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Long aLong) {
button.setText(aLong + "秒後重發");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
button.setEnabled(true);
button.setTextColor(Color.RED);
button.setText("傳送驗證碼");
}
});
}
2.RxJava2 系列框架
RxJava 框架 | 說明 | 開源地址 |
---|---|---|
RxAndroid | 針對 Android 平臺的擴充套件框架,方便 RxJava 用於 Android 開發,目前 RxAndroid 主要的功能是對 Android 主執行緒的排程 AndroidSchedulers.mainThread()。 | |
DataBinding | DataBinding 是基於MVVM思想實現資料和UI繫結的的框架,支援雙向繫結。 | DataBinding 是一個support庫,最低支援到Android 2.1 |
RxBinding | 基於 RxJava 的用於繫結 Android UI 控制元件的框架,它可以非同步獲取並處理控制元件的各類事件(例如點選事件、文字變化、選中狀態) | |
RxLifecycle | 生命週期繫結,提供了基於 Activity 和 Fragment 生命週期事件的自動完成佇列,用於避免不完整回撥導致的記憶體洩漏。 | |
RxBus | 是一種基於RxJava實現事件匯流排的一種思想。可以替代EventBus/Otto,因為他們都依賴於觀察者模式。 |
3.RxJava2 與 Retrofit 的使用
RxJava 與 Retrofit 的使用,更像我們的 AsyncTask,通過網路獲取資料然後通過 Handler 更新UI。首先需要匯入依賴:
compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.2.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
1.模擬使用者登陸獲取使用者資料
1.Bean物件:
public class UserParam {
private String param1;
private String param2;
public UserParam(String param1, String param2) {
this.param1 = param1;
this.param2 = param2;
}
// 省略了 getter setter
}
public class NetBean {
private FormBean form;
// 省略了 getter setter
public static class FormBean {
private String username;
private String password;
// 省略了 getter setter
}
}
public class UserBean {
private String username;
private String password;
public UserBean(String username, String password) {
this.username = username;
this.password = password;
}
// 省略了 getter setter
}
2.ApiService,這裡返回Observable物件,也就是我們RxJava的被觀察者
public interface ApiService {
@FormUrlEncoded
@POST("/post")
Observable<NetBean> getUserInfo(@Field("username")String username,
@Field("password")String password);
}
3.RxJava + Retrofit 的實現
// 構建Retrofit
ApiService apiService = new Retrofit.Builder()
.baseUrl("http://httpbin.org/")
.addConverterFactory(GsonConverterFactory.create()) // RxJava2與Gson混用
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // RxJava2與Retrofit混用
.build()
.create(ApiService.class);
// 構建RxJava
UserParam param = new UserParam("zhangsan", "123");
// 傳送param引數
Observable.just(param)
// flatMap方法是用於資料格式轉換的方法,引數一表示原資料,
// 引數二表示轉換的資料,那麼就是通過傳送網路引數,轉換成網路返回的資料,呼叫Retrofit
.flatMap(new Function<UserParam, ObservableSource<NetBean>>() {
@Override
public ObservableSource<NetBean> apply(@NonNull UserParam userParam)
throws Exception {
// 1.傳送網路請求,獲取NetBean
return apiService.getUserInfo(userParam.getParam1(), userParam.getParam2());
}
})
.flatMap(new Function<NetBean, ObservableSource<UserBean>>() {
@Override
public ObservableSource<UserBean> apply(@NonNull NetBean netBean)
throws Exception {
UserBean user = new UserBean(netBean.getForm().getUsername(),
netBean.getForm().getPassword());
// 2.轉換NetBean資料為我們需要的UserBean資料
return Observable.just(user);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<UserBean>() {
@Override
public void accept(@NonNull UserBean userBean) throws Exception {
Log.i("JAVA", "" + "使用者名稱:" + userBean.getUsername()
+ ", 密碼:" + userBean.getPassword());
}
});
2.模擬合併本地與伺服器購物車列表
這個案例其實就是使用者新增購物車的時候,首先會在本地儲存一份,然後發現如果沒有網路,那麼沒辦法提交到伺服器上,只能等下一次有網路的時候採用本地資料庫和伺服器資料的合併來實現上傳到伺服器。
首先需要準備 Retrofit 物件和獲取本地資料、網路資料的方法:
private ApiService apiService;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 省略
// 構建Retrofit
apiService = new Retrofit.Builder()
.baseUrl("http://httpbin.org/")
.addConverterFactory(GsonConverterFactory.create()) // RxJava2與Gson混用
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // RxJava2與Retrofit混用
.build()
.create(ApiService.class);
}
/**
* 獲取本地資料
*/
private Observable<List<String>> getDataForLocal() {
List<String> list = new ArrayList<>();
list.add("購物車的商品1");
list.add("購物車的商品2");
return Observable.just(list);
}
/**
* 獲取網路資料
*/
private Observable<List<String>> getDataForNet() {
return Observable.just("shopName")
// flatMap方法是用於資料格式轉換的方法,引數一表示原資料,
// 引數二表示轉換的資料,那麼就是通過傳送網路引數,轉換成網路返回的資料,呼叫Retrofit
.flatMap(new Function<String, ObservableSource<NetBean>>() {
@Override
public ObservableSource<NetBean> apply(@NonNull String s) throws Exception {
// 1.傳送網路請求,獲取資料
return apiService.getCartList(s);
}
}).flatMap(new Function<NetBean, ObservableSource<List<String>>>() {
@Override
public ObservableSource<List<String>> apply(@NonNull NetBean netBean) throws Exception {
// String shop = netBean.get_$Args257().getShopName();
String shop = "購物車的商品3";
List<String> list = new ArrayList<>();
list.add(shop);
// 2.轉換NetBean資料為我們需要的List<String>資料
return Observable.just(list);
}
}).subscribeOn(Schedulers.io());
}
然後就可以建立被觀察者並訂閱了,來完成合並本地與伺服器購物車列表操作:
// merge操作符: 將兩個ObservableSource合併為一個ObservableSource
Observable.merge(getDataForLocal(), getDataForNet())
.subscribe(new Observer<List<String>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(List<String> strings) {
for (String str: strings) { Log.i("JAVA", str); }
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
Log.i("JAVA", "onComplete");
}
});
最後的列印結果是:
I/JAVA: 購物車的商品1
I/JAVA: 購物車的商品2
I/JAVA: 購物車的商品3
I/JAVA: onComplete
4.RxJava2 與 RxBinding 的使用
1.優化搜尋請求
當我們在 EditText 打字時搜尋的時候,可能使用者會打字很會快,那麼我們就沒有必要一直髮送網路請求,請求搜尋結果,我們可以通過當使用者打字停止後的延時500毫秒再發送搜尋請求:
// RxTextView.textChanges(edittext): Rxbinding用法
RxTextView.textChanges(editText)
// 表示延時多少秒後執行,當你敲完字之後停下來的半秒就會執行下面語句
.debounce(500, TimeUnit.MILLISECONDS)
// 資料轉換 flatMap: 當同時多個數據請求訪問的時候,前面的網路資料會覆蓋後面的網路資料
// 資料轉換 switchMap: 當同時多個網路請求訪問的時候,會以最後一個傳送請求為準,前面網路資料會被最後一個覆蓋
.switchMap(new Function<CharSequence, ObservableSource<List<String>>>() {
@Override
public ObservableSource<List<String>> apply(
@NonNull CharSequence charSequence) throws Exception {
// 網路請求操作,獲取我們需要的資料
List<String> list = new ArrayList<String>();
list.add("2017");
list.add("2018");
return Observable.just(list);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<List<String>>() {
@Override
public void accept(@NonNull List<String> strings) throws Exception {
// 更新UI
Log.i("JAVA", strings.toString());
}
});
2.優化點選請求
當用戶一直點選一個按鈕的時候,我們不應該一直呼叫訪問網路請求,而是 1秒內,只執行一次網路請求。
RxView.clicks(button).throttleFirst(1, TimeUnit.SECONDS)
.subscribe(new Observer<Object>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Object o) {
Log.i("JAVA", "onClick");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
5.RxJava2 踩過的一些坑
1.未解除訂閱而引起的記憶體洩漏
舉個例子,對於前面常用操作符 interval 做週期性操作的例子,並沒有使之停下來的,沒有去控制訂閱的生命週期,這樣,就有可能引發記憶體洩漏。所以,在 Activity 的 onDestroy() 方法執行的時候或者不需要繼續執行的時候應該解除訂閱。
相關推薦
Android 響應式程式設計 RxJava2 完全解析
使用了 RxJava2 有一段時間了,深深感受到了其“牛逼”之處。下面,就從 RxJava2 的基礎開始,一步步與大家分享一下這個強大的非同步庫的用法!RxJava 是 一個在 Java VM 上使用可觀測的序列來組成非同步的、基於事件的程式的庫,也就是用於實現
Android 響應式程式設計 RxJava2 解析
使用了 RxJava2 有一段時間了,深深感受到了其“牛逼”之處。 RxJava2 基礎 RxJava可以濃縮為非同步兩個字,其核心的東西不外乎兩個, Observables(被觀察者) 和 Observable(觀察者)。Observables可以發
Android響應式程式設計之RxJava2.0
前言 優點: 1、鏈式操作 2、非同步優化 實戰 先來個簡單的使用示例 Observable .create(new ObservableOnSubscribe<String>() {
Android響應式程式設計(一)RxJava前篇[入門基礎]
1.RxJava概述 ReactiveX與RxJava 在講到RxJava之前我們首先要了解什麼是ReactiveX,因為RxJava是ReactiveX的一種java實現。 ReactiveX是Reactive Extensions的縮寫,一般簡寫為
Rxjava2入門:函式響應式程式設計及概述
Rxjava2入門教程一:https://www.jianshu.com/p/15b2f3d7141a Rxjava2入門教程二:https://www.jianshu.com/p/c8150187714c Rxjava2入門教程三:https://www.jianshu.com/p/6e7
響應式程式設計在Android 中的一些探索
響應式在前端領域已經變得十分流行,很多主流框架都採用響應式來進行頁面的展示重新整理。本文主要是探索一下響應式在移動端Android上的一些實踐,包括對響應式思想的理解,以及目前Android上實現響應式的一些手段,最後聊聊響應式在Android開發上的一些應用。
Rxjava2入門教程二:Observable與Observer響應式程式設計在Rxjava2中的典型實現
在RxJava中,函式響應式程式設計具體表現為一個觀察者(Observer)訂閱一個可觀察物件(Observable),通過建立可觀察物件發射資料流,經過一系列操作符(Operators)加工處理和執行緒排程器(Scheduler)在不同執行緒間的轉發,最後由觀察者接受並做出響應的一個過程 Observ
使用響應式程式設計(RxJava)開發Android App
如果你已經看過了RxJava或其他的ReactiveX庫的點贊數,你一定會同意我的說法:響應式程式設計的學習曲線很陡峭,而之所以形成這種學習體驗,則是因為沒有好的學習嚮導和書籍。 我探究了響應式程式設計(尤其是RxJava)背後的基本原理。我不想從Rx
響應式程式設計在Android中的應用
響應式程式設計簡介 響應式程式設計是一種基於非同步資料流概念的程式設計模式。資料流就像一條河:它可以被觀測,被過濾,被操作,或者為新的消費者與另外一條流合併為一條新的流。 響應式程式設計的一個關鍵概念是事件。事件可以被等待,可以觸發過程,也可以
響應式程式設計--Android Rxjava的使用(一)
RxJava作為一個響應式程式設計庫,在Android開發者中非常的受歡迎,越來越多的人開始接觸並使用,作為一個Android開發的菜鳥,仔細研究了一下RxJava的知識,在此將一些學習的過程和心得記錄一下 首先介紹一下RxJava相關的概念 Reactiv
Android函式響應式程式設計——RxJava的4大subject和執行緒控制
Subject Subject既可以是一個Observer也可以是一個Observable,它用來連線兩者。所以Subject被認為是Subject=Observable+Observer 1.PublishSubject PublishSubject在被建立完成之後立刻開
深入淺出RxJava四-在Android中使用響應式程式設計
原文連結 在第1,2,3篇中,我大概介紹了RxJava是怎麼使用的。下面我會介紹如何在Android中使用RxJava. RxAndroid RxAndroid是RxJava的一個針對Android平臺的擴充套件。它包含了一些能夠簡化Android開發的工
Android函式響應式程式設計——必學的RxJava組合操作符startWith、merge、concat、zip、combineLastest
1.startWith:給你被觀察者的資料流前再增加一點同類型的資料,這裡增加的是1,2 rx.Observable.just(3, 4, 5).startWith(1, 2) .subscribe(new Action1<Integer>()
Rxjava初步從Rxjava1到Rxjava2--響應式程式設計
Rxjava概述 a library for composing asynchronous and event-based programs using observable sequences for the Java VM 翻譯一下大概是,一個在JVM上為了構建(非同
前端【響應式】開發詳細解析
響應式設計 針對 標簽 ipad rem img ons 微信公眾 dev 一、響應式設計需要解決的問題是什麽? 針對目前大家常見的固定布局、自適應布局都是一種反應遲鈍的web設計,當Web頁面需要在各種顯示屏顯示時,他們就顯得力不從心了。因此,我們就需要相應設計。 優勢:
angular2響應式程式設計流
響應式程式設計: 就是非同步資料流程式設計,例如一個單機的事件就是一個流。 是以觀察者模式為核心的,rxjs概念 什麼是觀察者模式? 有兩個物件,一個是可觀察物件(Observable流),一個是觀察者。 先在可觀察物件內部註冊一些觀察者物件,如果可觀察物件內部發生了變化的時候
springboot2.x簡單詳細教程--高階篇幅之響應式程式設計(第十五章)
一、SprinBoot2.x響應式程式設計簡介 簡介:講解什麼是reactive響應式程式設計和使用的好處 1、基礎理解:  
響應式程式設計系列(一):什麼是響應式程式設計?reactor入門
響應式程式設計 系列文章目錄 (一)什麼是響應式程式設計?reactor入門 (二)Flux入門學習:流的概念,特性和基本操作 (三)Flux深入學習:流的高階特性和進階用法 (四)reactor-core響應式api如何測試和除錯? (五)Spring reactive: Spring WebFl
Reactive Stack系列(一):響應式程式設計從入門到放棄
為了詳細介紹下基於Spring Framework 5 & Spring Boot 2 的WebFlux的響應式程式設計,先畫下如下邏輯圖,後文將以邏輯圖箭頭方向逐一解釋關於響應式程式設計的點點滴滴。 1. Spring Framework5 自 2013 年12月Spring Fra
[譯]Flutter響應式程式設計:Streams和BLoC
想看原文請出門右轉原文傳送門 版本所有,轉載請註明出處。本文主要介紹Streams,Bloc和Reactive Programming(響應式程式設計)的概念。 理論和實踐範例。 難度:中級 介紹 我花了很長時間才找到介紹Reactive Programming,B