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的幾個操作符,可以看到對數據,事件的操作像流水線一樣,即使是線程的切換也變得很輕鬆,後續繼續加油