2016-9-9

2016-9-9

1.rxjava使用場景

1.計時:
Observable.interval(0, 10, TimeUnit.MILLISECONDS)
                .map(new Func1<Long, Long>() {
                    @Override
                    public Long call(Long aLong) {
                        return 60 - aLong;
                    }
                })
                .skipWhile(new Func1<Long, Boolean>() {
                    @Override
                    public Boolean call(Long aLong) {
                        return aLong >= 20;
                    }
                })
                .takeWhile(new Func1<Long, Boolean>() {
                    @Override
                    public Boolean call(Long aLong) {
                        return aLong >= 0;
                    }
                })
                .subscribe(new Action1<Long>() {
                    @Override
                    public void call(Long aLong) {
                        System.out.println("aLong = [" + aLong + "]");
                    }
                });
interval(long interval, TimeUnit unit): 每隔interval時間間隔後發射一次數據
interval(long initialDelay, long period, TimeUnit unit):第一次延遲initialDelay時間發射數據,之後每隔period時間發射數據
skipWhile:返回true時,開始發射數據, 丟棄之前發射的數據
takeWhile:返回false時,停止發射數據,整個訂閱完成(onComplete());
2. 多次點擊檢測
 Observable<Void> observable = RxView.clicks(view).share();
        observable.buffer(observable.debounce(200,TimeUnit.MILLISECONDS))
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<List<Void>>() {
                    @Override
                    public void call(List<Void> voids) {

                    }
                });
buffer():會將observable 發射的item緩存起來,直到它的參數Observable發射一個item時,它會將之前緩存的都作爲一個list發射出去
debounce:該item之後的一段時間內沒有item發出,則發出該item,丟棄該item之前的數據
Publish:通過Publish操作符可以將一個普通的Observable轉換爲一個Connectable Observable。Connectable Observable 可以被多次訂閱,被多個Subscriber共享Stream。但是和普通的Observable不同,它在被subscribe之後並不開始產生item,而需要在調用connect()之後纔會產生item。
Connect:在Publish中已經提到,用來讓Connectable Observable開始產生item。
Refcount:除了Connect,我們有另一種方式來讓Connectable Observable 產生item,那就是Refcount,refCount會在第一個subscriber訂閱之後自動connect,在最後一個subscriber unsubscribe之後自動disconnect。
Share:Share 其實就是publish().refCount();
3. 取數據先檢查緩存的場景
final Observable<String> memory = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        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 = rxPreferences.getString("cache").get();
        if (!TextUtils.isEmpty(cachePref)) {
            subscriber.onNext(cachePref);
        } else {
            subscriber.onCompleted();
        }
    }
});

Observable<String> network = Observable.just("network");

//主要就是靠concat operator來實現
Observable.concat(memory, disk, network)
.first()
.subscribeOn(Schedulers.newThread())
.subscribe(s -> {
    memoryCache = "memory";
    System.out.println("--------------subscribe: " + s);
});
4. 多個接口併發取完數據
//拼接兩個Observable的輸出,不保證順序,按照事件產生的順序發送給訂閱者
private void testMerge() {
    Observable<String> observable1 = DemoUtils.createObservable1().subscribeOn(Schedulers.newThread());
    Observable<String> observable2 = DemoUtils.createObservable2().subscribeOn(Schedulers.newThread());

    Observable.merge(observable1, observable2)
            .subscribeOn(Schedulers.newThread())
            .subscribe(System.out::println);
}
5. 一個接口的請求依賴另一個API請求返回的數據
 NetworkService.getToken("username", "password")
    .flatMap(s -> NetworkService.getMessage(s))
    .subscribe(s -> {
        System.out.println("message: " + s);
    });
6. 防止連續點擊
RxView.clicks(findViewById(R.id.btn_throttle))
    .throttleFirst(1, TimeUnit.SECONDS)
    .subscribe(aVoid -> {
        System.out.println("click");
    });
throttleFirst:該item是之後的一段時間內第一次發生的item,則發出該item,丟棄該時間內發生的其它item
7. 複雜的數據變換
Observable.just("1", "2", "2", "3", "4", "5")
    .map(Integer::parseInt)
    .filter(s -> s > 1)
    .distinct()
    .take(3)
    .reduce((integer, integer2) -> integer.intValue() + integer2.intValue())
    .subscribe(System.out::println);//9
map: 對Observable發射的每一項數據應用一個函數,轉換數據
filter: 只把符合條件的數據發出
distinct:去除發射的重複數據
take: 只發射前幾個數據
reduce: 對發射的所有數據應用給定的函數, 然後發射一個最終數據
8. 通過Observable的zip操作符把ResponseBody和url組合在一起(如下圖)
zip:多個Observable都發射數據後, 把發射的數據組合在一起發射出去, 有一observable發射錯誤數據, 則不再組合數據,直接發射錯誤


參考:
http://bbs.jointforce.com/topic/19448
http://blog.csdn.net/lzyzsd/article/details/50120801

發佈了46 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章