Я новичок в RxJava. Я хотел бы загрузить некоторые данные для каждого объекта TempoAccount
из данной коллекции и сохранить все это на карте accountsWithProjects
. Когда код последнего onNext(TempoAccount tempoAccount)
будет завершен, я бы назвал метод filterAccountsWithProjects(accountsWithProjects)
. Есть ли простой способ добиться этого?RxJava callback для последнего выполнения onNext() завершено
private void getProjectsForEachTempoAccount(Collection<TempoAccount> tempoAccounts) {
final Map<TempoAccount, Collection<TempoProject>> accountsWithProjects =
new HashMap<>(tempoAccounts.size());
Observable<TempoAccount> accountsObservable = Observable.from(tempoAccounts);
accountsObservable
.compose(ObservableUtils.applySchedulers())
.subscribe(new ObserverAdapter<TempoAccount>() {
@Override
public void onError(Throwable e) {
view.notifyAboutError(e.getMessage());
}
@Override
public void onNext(TempoAccount tempoAccount) {
jira.requestProjectsInfoForTempoAccount(String.valueOf(tempoAccount.getId()))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new ObserverAdapter<Collection<TempoProject>>() {
@Override
public void onError(Throwable e) {
view.notifyAboutError(e.getMessage());
}
@Override
public void onNext(Collection<TempoProject> projects) {
accountsWithProjects.put(tempoAccount, projects);
}
});
}
@Override
public void onCompleted() {
filterAccountsWithProjects(accountsWithProjects);
}
});
}
Проблема: В приведенном выше коде filterAccountsWithProjects(accountsWithProjects)
обжигают перед всеми наблюдаемыми из onNext(TempoAccount tempoAccount)
завершены.
Edit:
Я хочу создать Наблюдаемые такого типа: Observable<Map<TempoAccount, Collection<TempoProject>>
. У меня есть две наблюдаемые данные:
Observable<TempoAccount> accountsObservable = Observable.from(tempoAccounts)
Observable<Collection<TempoProject>> projectsForAccountObservable = jira.requestProjectsInfoForTempoAccount(TempoAccount account)
Так Мои вопросы: могу ли я connnect их как-то и создать карту, имеющую эти два наблюдаемыми.
'FlatMap()' удаляет информацию о объектах TempoAccount. В конце концов мне нужно собрать коллекцию таких объектов TempoAccount, которые связаны с ними с помощью «Collection», содержит объект TempoProject' с нужным значением «ключ» (некоторое поле). Не уверен, достаточно ли я достаточно :) –
Я думаю, это работа для метода 'map()' ... –
Это зависит. 'flatMap()' может создавать целый новый поток для значения, 'map()' преобразует значение в новое. Все зависит от вашего использования: –