【Rxjava學習】timer、interval、take、map實現計時器

1.Timer:創建一個延時的Obsevable發送給觀察者,即延時一段時間做某事

 LogUtils.e("開始");
        Observable.timer(3000, TimeUnit.MILLISECONDS)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(Long aLong) throws Exception {
                        LogUtils.e("當前線程:"+Thread.currentThread().getName()+",結束:"+aLong);
                    }
                });

延時3秒後打印結果,.observeOn(AndroidSchedulers.mainThread()) 指定觀察者再主線程

 

2.interval:創建一個可週期性發送事件的被觀察者,即每隔一段時間做某事

//        第一個參數間隔多長時間,第二個參數時間單位毫秒
        Observable.interval(1000,TimeUnit.MILLISECONDS)
                .subscribe(new Consumer<Long>() {
            @Override
            public void accept(Long aLong) throws Exception {
                LogUtils.e("當前線程:"+Thread.currentThread().getName()+",倒計時:"+aLong);

            }
        });

每隔1秒發送一個事件,這裏沒有指定觀察者所在線程,可以看到是在Rxjava下的一個工作線程

  LogUtils.e("開始");
        Observable.interval(5000,2000,TimeUnit.MILLISECONDS).subscribe(new Consumer<Long>() {
            @Override
            public void accept(Long aLong) throws Exception {
                LogUtils.e("當前線程:"+Thread.currentThread().getName()+",倒計時:"+aLong);
            }
        });

interval的第一個參數是指延時多長時間才發送事件,可以看出這裏延遲了5s,觀察者才接收第一個事件

 

3.map:屬於變換操作符,它的作用將被觀察者Observable發送的數據應用一個函數進行變換操作,然後將變換後的數據發送給觀察者Observer

take:屬於過濾操作符,規定發送給觀察者的總的事件數

上面interval的應用只能做計時操作,要做倒計時的話,這裏就需要map進行數據的轉換,然後再發送給觀察者

  //map操作符屬於變換操作符,它的作用將被觀察者Observable發送的數據應用一個函數進行變換操作,然後將變換後的數據發送給觀察者Observer。
        //take 規定發給觀察者的次數
        long totalTime = 10;
        LogUtils.e("開始");
        Observable.interval(2000,1000,TimeUnit.MILLISECONDS)
                .take(10)//限制發送次數
                .map(new Function<Long, Long>() {
            @Override
            public Long apply(Long aLong) throws Exception {
                return totalTime - aLong;//將接受的1,2,3... 轉換爲 3,2,1..類似的數據
            }
        }).subscribe(new Consumer<Long>() {
            @Override
            public void accept(Long aLong) throws Exception {
                LogUtils.e("當前線程:"+Thread.currentThread().getName()+",倒計時:"+aLong);
            }
        });

一個10s的倒計時操作就完成了,map的使用可以舉一反三,比如服務器返回的json數據,我們可以轉換爲對應的對象;

 

總結:簡單的體驗了Rxjava的幾個操作符,可以看到對數據,事件的操作像流水線一樣,即使是線程的切換也變得很輕鬆,後續繼續加油

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章