前面兩個(gè)方法,zip()和merge()方法作用在發(fā)射數(shù)據(jù)的范疇內(nèi),在決定如何操作值之前有些場(chǎng)景我們需要考慮時(shí)間的。RxJava的join()函數(shù)基于時(shí)間窗口將兩個(gè)Observables發(fā)射的數(shù)據(jù)結(jié)合在一起。
http://wiki.jikexueyuan.com/project/rxjava/images/chapter6_6.png" alt="" />
為了正確的理解上一張圖,我們解釋下join()需要的參數(shù):
Func1參數(shù):在指定的由時(shí)間窗口定義時(shí)間間隔內(nèi),源Observable發(fā)射的數(shù)據(jù)和從第二個(gè)Observable發(fā)射的數(shù)據(jù)相互配合返回的Observable。Func1參數(shù):在指定的由時(shí)間窗口定義時(shí)間間隔內(nèi),第二個(gè)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);
}
});
}
我們有一個(gè)新的對(duì)象appsSequence,它是一個(gè)每秒從我們已安裝的app列表發(fā)射app數(shù)據(jù)的可觀(guān)測(cè)序列。tictoc這個(gè)Observable數(shù)據(jù)每秒只發(fā)射一個(gè)新的Long型整數(shù)。為了合并它們,我們需要指定兩個(gè)Func1變量:
appInfo -> Observable.timer(2, TimeUnit.SECONDS)
time -> Observable.timer(0, TimeUnit.SECONDS)
上面描述了兩個(gè)時(shí)間窗口。下面一行描述我們?nèi)绾问褂?code>Func2將兩個(gè)發(fā)射的數(shù)據(jù)結(jié)合在一起。
this::updateTitle
結(jié)果如下:
http://wiki.jikexueyuan.com/project/rxjava/images/chapter6_7.png" alt="" />
它看起來(lái)有點(diǎn)亂,但是注意app的名字和我們指定的時(shí)間窗口,我們可以看到:一旦第二個(gè)數(shù)據(jù)發(fā)射了我們就會(huì)將它與源數(shù)據(jù)結(jié)合,但我們用同一個(gè)源數(shù)據(jù)有2秒鐘。這就是為什么標(biāo)題重復(fù)數(shù)字增加的原因。
值得一提的是,為了簡(jiǎn)單起見(jiàn),也有一個(gè)join()操作符作用于字符串然后簡(jiǎn)單的和發(fā)射的字符串連接成最終的字符串。
http://wiki.jikexueyuan.com/project/rxjava/images/chapter6_8.png" alt="" />