RxJava 經常使用的幾種方法 。

須要引入的依賴包,這個依賴包依賴於RxJava和RxAndroid,會自動引入進來,也能夠本身手動單獨的引入。
compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'
/**
 * Scheduler線程切換
 * <p>
 * 這種場景常常會在「後臺線程取數據,主線程展現」的模式中看見
 */
private void rj1() {
    Observable.just(1, 2, 3, 4)
            .subscribeOn(Schedulers.io())//指定subscribe()發生在IO線程
            .observeOn(AndroidSchedulers.mainThread())//指定Subscriber回調發生在主線程
            .subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    KLog.d(integer);
                }
            });
}
/**
 * 使用debounce作textSearch
 * <p>
 * 當N個結點發生的時間太靠近(即發生的時間差小於設定的值T),debounce就會自動過濾掉前N-1個結點。
 * <p>
 * 好比在作百度地址聯想的時候,可使用debounce減小頻繁的網絡請求。避免每輸入(刪除)一個字就作一次聯想
 * <p>
 * Toolbar使用RxToolbar監聽點擊事件; Snackbar使用RxSnackbar監聽;
 * EditText使用RxTextView監聽; 其他使用RxView監聽.
 */
private void rj2(TextView textView) {
    RxTextView.textChangeEvents(textView)
            .debounce(400, TimeUnit.MILLISECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<TextViewTextChangeEvent>() {
                @Override
                public void onCompleted() {
                    KLog.d("onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    KLog.d(e.toString());
                }

                @Override
                public void onNext(TextViewTextChangeEvent textViewTextChangeEvent) {
                    KLog.d(textViewTextChangeEvent.toString());
                }
            });
}
/**
 * 使用combineLatest合併最近N個結點
 * <p>
 * 例如:註冊的時候全部輸入信息(郵箱、密碼、電話號碼等)合法才點亮註冊按鈕。
 */
private void rj3(TextView tvEmail, TextView tvPassword, TextView tvNumber) {
    Observable<CharSequence> email = RxTextView.textChanges(tvEmail).skip(1);
    Observable<CharSequence> password = RxTextView.textChanges(tvPassword).skip(1);
    Observable<CharSequence> number = RxTextView.textChanges(tvNumber).skip(1);
    Observable.combineLatest(email, password, number, new Func3<CharSequence, CharSequence, CharSequence, Boolean>() {
        @Override
        public Boolean call(CharSequence email, CharSequence password, CharSequence number) {
            boolean emailValid = !StrUtils.isBlank(email.toString());
            boolean passwordValid = !StrUtils.isBlank(password.toString());
            boolean numberValid = !StrUtils.isBlank(number.toString());

            if (!emailValid) {
                KLog.d("emailValid error");
            }
            if (!passwordValid) {
                KLog.d("passwordValid error");
            }
            if (!numberValid) {
                KLog.d("numberValid error");
            }

            return emailValid && passwordValid && numberValid;
        }
    }).subscribe(new Subscriber<Boolean>() {
        @Override
        public void onCompleted() {
            KLog.d("onCompleted");
        }

        @Override
        public void onError(Throwable e) {
            KLog.d(e.toString());
        }

        @Override
        public void onNext(Boolean o) {
            KLog.d(o);
        }
    });
}
/**
 * 使用merge合併兩個數據源。
 * <p>
 * 界面須要等到多個接口併發取完數據,再更新
 * 例如一組數據來自網絡,一組數據來自文件,須要合併兩組數據一塊兒展現。
 */
private void rj4() {
    Observable.merge(HttpAchieve.getHttp(""), HttpAchieve.getHttp(""))
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<IdCode>() {
                @Override
                public void onCompleted() {
                    KLog.d("onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    KLog.d(e.toString());
                }

                @Override
                public void onNext(IdCode idCode) {
                    KLog.d("onNext");
                }
            });
}
/**
 * 使用concat和first作緩存
 * <p>
 * 依次檢查memory、disk和network中是否存在數據,任何一步一旦發現數據後面的操做都不執行。
 */
private void rj5() {
    Observable<String> memory = Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            String memoryCache = "";//這裏只是聲明一個變量,你能夠本身作檢查內存是否存在
            if (memoryCache != null) {
                subscriber.onNext(memoryCache);
            } else {
                subscriber.onCompleted();
            }
        }
    });
    Observable<String> disk = Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            String cachePref = "";//cachePref =rxPreferences.getString("cache").get(); //這裏獲取SD卡數據
            if (StrUtils.isBlank(cachePref)) {
                subscriber.onCompleted();
            } else {
                subscriber.onNext(cachePref);
            }
        }
    });
    Observable<String> network = Observable.just("network");
    //一次檢查memory, disk, network
    Observable.concat(memory, disk, network)
            .first()
            .subscribeOn(Schedulers.newThread())
            .subscribe(s -> {
                KLog.d(s);
            });
}
/**
 * 使用timer作定時操做。當有「x秒後執行y操做」相似的需求的時候,想到使用timer
 * <p>
 * 例如:2秒後輸出日誌「hello world」,而後結束。
 */
private void rj6() {
    Observable.timer(2, TimeUnit.SECONDS)
            .subscribe(new Subscriber<Long>() {
                @Override
                public void onCompleted() {
                    KLog.d("onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    KLog.d(e.toString());
                }

                @Override
                public void onNext(Long aLong) {
                    KLog.d(aLong);
                }
            });
}
/**
 * 使用interval作週期性操做。當有「每隔xx秒後執行yy操做」相似的需求的時候,想到使用interval
 * <p>
 * 例如:每隔2秒輸出日誌「helloworld」。
 */
private void rj7() {
    Observable.interval(2, TimeUnit.SECONDS)
            .subscribe(new Subscriber<Long>() {
                @Override
                public void onCompleted() {
                    KLog.d("onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    KLog.d(e.toString());
                }

                @Override
                public void onNext(Long aLong) {
                    KLog.d(aLong);
                }
            });
}

/**
 * 使用throttleFirst防止按鈕重複點擊
 * <p>
 * debounce也能達到一樣的效果
 */
private void rj8(Button button) {
    RxView.clicks(button)
            .throttleFirst(1, TimeUnit.SECONDS)
            .subscribe(new Subscriber<Object>() {
                @Override
                public void onCompleted() {
                    KLog.d("onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    KLog.d(e.toString());
                }

                @Override
                public void onNext(Object o) {
                    KLog.d(o);
                }
            });
}

/**
 * 使用schedulePeriodically作輪詢請求
 */
private void rj9() {
    Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            Schedulers.newThread().createWorker().schedulePeriodically(new Action0() {
                @Override
                public void call() {
                    subscriber.onNext("");
                }
            }, 0, 1000, TimeUnit.MILLISECONDS);//0初始間隔,1000輪詢間隔,時間模式
        }
    }).subscribe(new Action1<String>() {
        @Override
        public void call(String s) {

        }
    });
}

/**
 * RxJava進行數組、list的遍歷
 */
private void rj10() {
    String[] names = {"Tom", "Lily", "Alisa", "Sheldon", "Bill"};
    Observable.from(names)
            .subscribe(new Action1<String>() {
                @Override
                public void call(String s) {
                    KLog.d(s);
                }
            });
}

/**
 * 一個接口的請求依賴另外一個API請求返回的數據
 * <p>
 * 舉個例子,咱們常常在須要登錄以後,根據拿到的token去獲取消息列表。
 */
private void rj11(String idCode) {
    Api.getInstance().movieService.login(idCode)//請求用戶的數據
            .flatMap(s ->
                    Api.getInstance().movieService.login(idCode)//經過用戶的數據請求消息列表
            )
            .subscribe(s -> {
                KLog.d(s);
            });
}

/**
 * 循環輸出元素,過濾不知足條件的,最多輸出5個結果,輸出以後作額外的操做
 */
private void rj12() {
    String[] strings = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
    Observable.just(strings)
            .flatMap(new Func1<String[], Observable<String>>() {
                @Override
                public Observable<String> call(String[] strings) {
                    return Observable.from(strings);
                }
            })
            .filter(new Func1<String, Boolean>() { //過濾掉不等於空的
                @Override
                public Boolean call(String s) {
                    return !StrUtils.isBlank(s);
                }
            })
            .take(5) // 只輸出5次
            .doOnNext(new Action1<String>() {
                @Override
                public void call(String s) {
                    KLog.d("在這裏作額外的操做");
                }
            })
            .subscribe(new Action1<String>() {
                @Override
                public void call(String s) {
                    KLog.d(s);
                }
            });
}

/**
 * 按鈕的長按時間監聽
 */
private void rj13(Button button) {
    RxView.longClicks(button)
            .subscribe(new Action1<Void>() {
                @Override
                public void call(Void aVoid) {
                    KLog.d("call");
                }
            });
}

/**
 * ListView 的點擊事件、長按事件處理
 */
private void rj14(ListView listView) {
    //item點擊事件
    RxAdapterView.itemClicks(listView)
            .subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    KLog.d("ListView點擊事件");
                }
            });
}

/**
 * ListView 的點擊事件、長按事件處理
 */
private void rj15(ListView listView) {
    //item 長按事件
    RxAdapterView.itemLongClicks(listView)
            .subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    KLog.d("ListView點擊事件");
                }
            });
}

/**
 * 響應式編程,選中後作響應的處理,
 * <p>
 * 用戶登陸界面,勾選通用協議,登陸按鈕就高亮顯示
 */
private void rj16(CheckBox checkBox) {
    RxCompoundButton.checkedChanges(checkBox)
            .subscribe(new Action1<Boolean>() {
                @Override
                public void call(Boolean aBoolean) {
                    KLog.d("在這裏設置Button可點擊高亮顯示");
                }
            });
}


本身從網上搜索和整理總結的,還有其餘的用法能夠在評論中告訴我。編程

相關文章
相關標籤/搜索