我運行下面的代碼:RxJava - 調試鏈似乎永遠阻塞
List<GroupedObservable<BcxToDoList, BcxToDo>> mToDoList;
mToDoList = bcxClient
.fetchToDos()
.flatMap(new Func1<List<BcxToDo>, Observable<BcxToDo>>() {
@Override
public Observable<BcxToDo> call(List<BcxToDo> bcxToDos) {
return Observable.from(bcxToDos);
}
})
.groupBy(new Func1<BcxToDo, BcxToDoList>() {
@Override
public BcxToDoList call(BcxToDo bcxToDo) {
return bcxToDo.toDoList;
}
})
.toList()
.toBlocking()
.single();
當我踏進這個代碼Android Studio中,代碼塊下去。如果我使用subscribe()
來捕獲它,則沒有例外。
什麼是調試正在進行的最佳方式?
UPDATE
繼@ dwursteisen的建議下,我用.doOnNext()
看到.groupBy()
被髮射的。它正在創建我期望的輸出,它從未發送onCompleted通知。
根據thesetickets,在RxJava這是設計。必須處理每個GroupedObservable以便toList運算符工作。
因此,這裏是我的修改後的代碼:
List<BcxToDoList> mToDoList;
mToDoList = bcxClient
.fetchToDos()
.flatMap(new Func1<List<BcxToDo>, Observable<BcxToDo>>() {
@Override
public Observable<BcxToDo> call(List<BcxToDo> bcxToDos) {
return Observable.from(bcxToDos);
}
})
.groupBy(new Func1<BcxToDo, BcxToDoList>() {
@Override
public BcxToDoList call(BcxToDo bcxToDo) {
return bcxToDo.toDoList;
}
})
.flatMap(new Func1<GroupedObservable<BcxToDoList, BcxToDo>, Observable<BcxToDoList>>() {
@Override
public Observable<BcxToDoList> call(final GroupedObservable<BcxToDoList, BcxToDo> bcxToDoListBcxToDoGroupedObservable) {
return bcxToDoListBcxToDoGroupedObservable
.toList()
.flatMap(new Func1<List<BcxToDo>, Observable<BcxToDoList>>() {
@Override
public Observable<BcxToDoList> call(List<BcxToDo> bcxToDos) {
bcxToDoListBcxToDoGroupedObservable.getKey().toDos.addAll(bcxToDos);
return Observable.just(bcxToDoListBcxToDoGroupedObservable.getKey());
}
});
}
})
.toList()
.toBlocking()
.single();
不太優雅的第一個代碼段,但至少它不再塊!如果有什麼我可以做的,使新的代碼片段更具可讀性,我會很感激任何建議。
我認爲你是對的,如果我刪除GROUPBY,然後代碼工作。使用groupBy,doOnNext會被調用兩次(這是正確的計數),但是會被阻塞。那麼爲什麼這個團隊不會發送一個完整的事件呢? – Mitkins 2015-04-04 11:53:29
找到阻塞的原因 - https://github.com/ReactiveX/RxJava/issues/844。根據這張票,每個GroupedObservables必須訂閱 – Mitkins 2015-04-04 13:17:46