看起来像由myEvent.findMemberships()
call 永远不会调用 onComplete。你能显示这段代码吗?
如果是这种情况,就可以解释您所看到的行为。这.toList()
在所有项目都已发出(由 onComplete 发出信号)之前,不会发出列表。
你的第二个版本没有.toList()
,将按如下方式进行:
.findMemberships()
emits a single List<Membership>
.flatMap()
transforms List<Membership> into a single List<User>
Observable.from(users) creates an observable that emits each user
.subscribe()
onNext() is called for each user
onCompleted() is never called.
您的原始版本:
.findMemberships()
emits a single List<Membership>
.flatMap()
transforms List<Membership> into a single List<User>
Observable.from(users) creates an observable that emits each user
.toList()
buffers each User waiting for onCompleted() to be called
onCompleted is never called because the .findMemberships Observable never completes
有几种解决方案:
1) 使findMemberShips()
Observable 调用 onComplete。如果 Observable 返回的是findMemberShips()
是一个 Rx 主题(PublishSubject、BehaviourSubject 等)
2) Use Observable.just()
代替Observable.from()
。你已经有一个List<User>
在 .flatMap() 中,只需返回它即可。使用Observable.from(users)
创建一个发出每个用户的 Observable。Observable.just(users)
会创建一个发出单个信号的 ObservableList<User>
。不需要.toList()
.
3) Use .map()
代替.flatMap()
。再次强调,不需要.toList()
。由于每个List<Membership>
转变为List<User>
你只需要使用.map()
.
myEvent
.findMemberships()
.map(new Func1<List<Membership>, List<User>>() {
@Override
public List<User> call(List<Membership> memberships) {
List<User> users = new ArrayList<User>();
for (Membership membership : memberships) {
users.add(membership.getUser());
}
return users;
}
})