Rxjava
因爲其基於事件流的鏈式調用、邏輯簡潔 & 使用簡單的特色,深受各大 Android
開發者的歡迎。若是還不瞭解RxJava,請看文章:Android:這是一篇 清晰 & 易懂的Rxjava 入門教程java
Rxjava
的的基本使用 & 實際應用案例教學,即常見開發應用場景實現 ,並結合經常使用相關框架如Retrofit
等,但願你們會喜歡。
- 本系列文章主要基於
Rxjava 2.0
- 接下來的時間,我將持續推出
Android
中Rxjava 2.0
的一系列文章,包括原理、操做符、應用場景、背壓等等 ,有興趣能夠繼續關注Carson_Ho的安卓開發筆記!!
RxJava
的簡介以下api
Rxjava
的使用方式有兩種: 方式1:分步驟實現 緩存
具體使用 請看文章Android RxJava:面向初學者的RxJava使用指南bash
RxJava
的實際開發應用場景 與 其對應的操做符息息相關RxJava
實際開發應用場景有以下:下面實例皆結合經常使用框架如
Retrofit
、RxBinding
、RxBus
等微信
需求場景 網絡
需求場景 異步
功能需求說明ide
如 先進行 用戶註冊 的網絡請求, 待註冊成功後回再繼續發送 用戶登陸 的網絡請求函數
下面展現的是結合
Retrofit
與RxJava
的基本用法,即未用操做符前
// 發送註冊網絡請求的函數方法
private void register() {
api.register(new RegisterRequest())
.subscribeOn(Schedulers.io()) //在IO線程進行網絡請求
.observeOn(AndroidSchedulers.mainThread()) //回到主線程去處理請求結果
.subscribe(new Consumer<RegisterResponse>() {
@Override
public void accept(RegisterResponse registerResponse) throws Exception {
Toast.makeText(MainActivity.this, "註冊成功", Toast.LENGTH_SHORT).show();
login(); //註冊成功, 調用登陸的方法
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Toast.makeText(MainActivity.this, "註冊失敗", Toast.LENGTH_SHORT).show();
}
});
}
// 發送登陸網絡請求的函數方法
private void login() {
api.login(new LoginRequest())
.subscribeOn(Schedulers.io()) //在IO線程進行網絡請求
.observeOn(AndroidSchedulers.mainThread()) //回到主線程去處理請求結果
.subscribe(new Consumer<LoginResponse>() {
@Override
public void accept(LoginResponse loginResponse) throws Exception {
Toast.makeText(MainActivity.this, "登陸成功", Toast.LENGTH_SHORT).show();
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Toast.makeText(MainActivity.this, "登陸失敗", Toast.LENGTH_SHORT).show();
}
});
}
複製代碼
解決方案 結合 RxJava2
中的變換操做符FlatMap()
實現嵌套網絡請求
需求場景
功能說明 對於從磁盤 / 內存緩存中 獲取緩存數據 的功能邏輯以下:
功能說明 即,同時向2個數據源獲取數據 -> 合併數據 -> 統一展現到客戶端
如,填寫表單時,須要表單裏全部信息(姓名、年齡、職業等)都被填寫後,才容許點擊 "提交" 按鈕
功能說明 此處採用 填寫表單 做爲聯合判斷功能展現,即,表單裏全部信息(姓名、年齡、職業等)都被填寫後,才容許點擊 "提交" 按鈕
UI
需求場景
功能說明
需求場景
功能說明
a. 背景
- 發送 & 接收事件速度 = 單位時間內 發送&接收事件的數量
- 大多數狀況,主要是 被觀察者發送事件速度 > 觀察者接收事件速度
b. 衝突
- 如,點擊按鈕事件:連續過快的點擊按鈕10次,則只會形成點擊2次的效果;
- 解釋:由於點擊速度太快了,因此按鈕來不及響應
下面再舉個例子:
即出現發送 & 接收事件嚴重不匹配的問題
Observable.create(new ObservableOnSubscribe<Integer>() {
// 1. 建立被觀察者 & 生產事件
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
for (int i = 0; ; i++) {
Log.d(TAG, "發送了事件"+ i );
Thread.sleep(10);
// 發送事件速度:10ms / 個
emitter.onNext(i);
}
}
}).subscribeOn(Schedulers.io()) // 設置被觀察者在io線程中進行
.observeOn(AndroidSchedulers.mainThread()) // 設置觀察者在主線程中進行
.subscribe(new Observer<Integer>() {
// 2. 經過經過訂閱(subscribe)鏈接觀察者和被觀察者
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "開始採用subscribe鏈接");
}
@Override
public void onNext(Integer value) {
try {
// 接收事件速度:5s / 個
Thread.sleep(5000);
Log.d(TAG, "接收到了事件"+ value );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "對Error事件做出響應");
}
@Override
public void onComplete() {
Log.d(TAG, "對Complete事件做出響應");
}
});
複製代碼
OOM
c. 解決方案 採用 背壓策略
至此,關於RxJava
常見的實際開發應用場景講解完畢。
RxJava2
中經常使用的實際開發應用場景講解進行了詳細介紹,下面用1張圖進行總結Android
中 Rxjava 2.0
的一系列文章,包括原理、操做符、應用場景、背壓等等 ,有興趣能夠繼續關注Carson_Ho的安卓開發筆記!!