combineLatest
RxJava的combineLatest()函数有点像zip()函数的特殊形式。正如我们已经学习的,zip()作用于最近未打包的两个Observables。相反,combineLatest()作用于最近发射的数据项:如果Observable1发射了A并且Observable2发射了B和C,combineLatest()将会分组处理AB和AC,如下图所示:
combineLatest()函数接受二到九个Observable作为参数,如果有需要的话或者单个Observables列表作为参数。
从之前的例子中把loadList()函数借用过来,我们可以修改一下来用于combineLatest()实现“真实世界”这个例子:
1
private void loadList(List<AppInfo> apps) {
2
mRecyclerView.setVisibility(View.VISIBLE);
3
Observable<AppInfo> appsSequence = Observable.interval(1000, TimeUnit.MILLISECONDS)
4
.map(position ->apps.get(position.intValue()));
5
Observable<Long> tictoc = Observable.interval(1500, TimeUnit.MILLISECONDS);
6
Observable.combineLatest(appsSequence, tictoc,
7
this::updateTitle)
8
.observeOn(AndroidSchedulers.mainThread())
9
.subscribe(new Observer<AppInfo>() {
10
11
@Override
12
public void onCompleted() {
13
Toast.makeText(getActivity(), "Here is the list!", Toast.LENGTH_LONG).show();
14
}
15
16
@Override
17
public void onError(Throwable e) {
18
mSwipeRefreshLayout.setRefreshing(false);
19
Toast.makeText(getActivity(), "Something went wrong!", Toast.LENGTH_SHORT).show();
20
}
21
22
@Override
23
public void onNext(AppInfoappInfo) {
24
if (mSwipeRefreshLayout.isRefreshing()) {
25
mSwipeRefreshLayout.setRefreshing(false);
26
}
27
mAddedApps.add(appInfo);
28
int position = mAddedApps.size() - 1;
29
mAdapter.addApplication(position, appInfo);
30
mRecyclerView.smoothScrollToPosition(position);
31
}
32
});
33
}
Copied!
这我们使用了两个Observables:一个是每秒钟从我们已安装的应用列表发射一个App数据,第二个是每隔1.5秒发射一个Long型整数。我们将他们结合起来并执行updateTitle()函数,结果如下:
正如你看到的,由于不同的时间间隔,AppInfo对象如我们所预料的那样有时候会重复。
Last modified 2yr ago
Copy link