前面兩個方法,zip()
和merge()
方法作用在發(fā)射數(shù)據(jù)的范疇內(nèi),在決定如何操作值之前有些場景我們需要考慮時間的。RxJava的join()
函數(shù)基于時間窗口將兩個Observables發(fā)射的數(shù)據(jù)結(jié)合在一起。
http://wiki.jikexueyuan.com/project/rxjava/images/chapter6_6.png" alt="" />
為了正確的理解上一張圖,我們解釋下join()
需要的參數(shù):
Func1
參數(shù):在指定的由時間窗口定義時間間隔內(nèi),源Observable發(fā)射的數(shù)據(jù)和從第二個Observable發(fā)射的數(shù)據(jù)相互配合返回的Observable。Func1
參數(shù):在指定的由時間窗口定義時間間隔內(nèi),第二個Observable發(fā)射的數(shù)據(jù)和從源Observable發(fā)射的數(shù)據(jù)相互配合返回的Observable。Func2
參數(shù):定義已發(fā)射的數(shù)據(jù)如何與新發(fā)射的數(shù)據(jù)項(xiàng)相結(jié)合。如下練習(xí)的例子,我們可以修改loadList()
函數(shù)像下面這樣:
private void loadList(List<AppInfo> apps) {
mRecyclerView.setVisibility(View.VISIBLE);
Observable<AppInfo> appsSequence =
Observable.interval(1000, TimeUnit.MILLISECONDS)
.map(position -> {
return apps.get(position.intValue());
});
Observable<Long> tictoc = Observable.interval(1000,TimeUnit.MILLISECONDS);
appsSequence.join(
tictoc,
appInfo -> Observable.timer(2,TimeUnit.SECONDS),
time -> Observable.timer(0, TimeUnit.SECONDS),
this::updateTitle)
.observeOn(AndroidSchedulers.mainThread())
.take(10)
.subscribe(new Observer<AppInfo>() {
@Override
public void onCompleted() {
Toast.makeText(getActivity(), "Here is the list!", Toast.LENGTH_LONG).show();
}
@Override
public void onError(Throwable e) {
mSwipeRefreshLayout.setRefreshing(false);
Toast.makeText(getActivity(), "Something went wrong!", Toast.LENGTH_SHORT).show();
}
@Override
public void onNext(AppInfoappInfo) {
if (mSwipeRefreshLayout.isRefreshing()) {
mSwipeRefreshLayout.setRefreshing(false);
}
mAddedApps.add(appInfo);
int position = mAddedApps.size() - 1;
mAdapter.addApplication(position, appInfo);
mRecyclerView.smoothScrollToPosition(position);
}
});
}
我們有一個新的對象appsSequence
,它是一個每秒從我們已安裝的app列表發(fā)射app數(shù)據(jù)的可觀測序列。tictoc
這個Observable數(shù)據(jù)每秒只發(fā)射一個新的Long
型整數(shù)。為了合并它們,我們需要指定兩個Func1
變量:
appInfo -> Observable.timer(2, TimeUnit.SECONDS)
time -> Observable.timer(0, TimeUnit.SECONDS)
上面描述了兩個時間窗口。下面一行描述我們?nèi)绾问褂?code>Func2將兩個發(fā)射的數(shù)據(jù)結(jié)合在一起。
this::updateTitle
結(jié)果如下:
http://wiki.jikexueyuan.com/project/rxjava/images/chapter6_7.png" alt="" />
它看起來有點(diǎn)亂,但是注意app的名字和我們指定的時間窗口,我們可以看到:一旦第二個數(shù)據(jù)發(fā)射了我們就會將它與源數(shù)據(jù)結(jié)合,但我們用同一個源數(shù)據(jù)有2秒鐘。這就是為什么標(biāo)題重復(fù)數(shù)字增加的原因。
值得一提的是,為了簡單起見,也有一個join()
操作符作用于字符串然后簡單的和發(fā)射的字符串連接成最終的字符串。
http://wiki.jikexueyuan.com/project/rxjava/images/chapter6_8.png" alt="" />