And,Then和When
在将来还有一些zip()满足不了的场景。如复杂的架构,或者是仅仅为了个人爱好,你可以使用And/Then/When解决方案。它们在RxJava的joins包下,使用Pattern和Plan作为中介,将发射的数据集合并到一起。
我们的loadList()函数将会被修改从这样:
1
private void loadList(List<AppInfo> apps) {
2
3
mRecyclerView.setVisibility(View.VISIBLE);
4
5
Observable<AppInfo> observableApp = Observable.from(apps);
6
7
Observable<Long> tictoc = Observable.interval(1, TimeUnit.SECONDS);
8
9
Pattern2<AppInfo, Long> pattern = JoinObservable.from(observableApp).and(tictoc);
10
11
Plan0<AppInfo> plan = pattern.then(this::updateTitle);
12
13
JoinObservable
14
.when(plan)
15
.toObservable()
16
.observeOn(AndroidSchedulers.mainThread())
17
.subscribe(new Observer<AppInfo>() {
18
19
@Override
20
public void onCompleted() {
21
Toast.makeText(getActivity(), "Here is the list!", Toast.LENGTH_LONG).show();
22
}
23
24
@Override
25
public void onError(Throwable e) {
26
mSwipeRefreshLayout.setRefreshing(false);
27
Toast.makeText(getActivity(), "Something went wrong!", Toast.LENGTH_SHORT).show();
28
}
29
30
@Override
31
public void onNext(AppInfoappInfo) {
32
if (mSwipeRefreshLayout.isRefreshing()) {
33
mSwipeRefreshLayout.setRefreshing(false);
34
}
35
mAddedApps.add(appInfo);
36
int position = mAddedApps.size() - 1;
37
mAdapter.addApplication(position, appInfo); mRecyclerView.smoothScrollToPosition(position);
38
}
39
});
40
}
Copied!
和通常一样,我们有两个发射的序列,observableApp,发射我们安装的应用列表数据,tictoc每秒发射一个Long型整数。现在我们用and()连接源Observable和第二个Observable。
1
JoinObservable.from(observableApp).and(tictoc);
Copied!
这里创建一个pattern对象,使用这个对象我们可以创建一个Plan对象:"我们有两个发射数据的Observables,then()是做什么的?"
1
pattern.then(this::updateTitle);
Copied!
现在我们有了一个Plan对象并且当plan发生时我们可以决定接下来发生的事情。
1
.when(plan).toObservable()
Copied!
这时候,我们可以订阅新的Observable,正如我们总是做的那样。
Last modified 2yr ago
Copy link