У меня TestService, где я выполняю асинхронную задачу для получения данных. Я хотел бы дождаться ответа, прежде чем продолжить.
public List<Data> getData() {
List<Data> data = new ArrayList<>();
Disposable disposable = repository.getDataFromApi(false)
.observeOn(AndroidSchedulers.mainThread())
.subscribe( newData -> {
data.addAll(newData);
}, __ -> { });
mCompositeDisposable.add(disposable);
//Here I want to stop till "Data" arraylist is filled with data
... do something with data
}
В Volley я мог просто вызвать req.executeSynchronously();, чтобы это произошло. Поскольку getData() уже должен возвращать данные, мне нужно как-то заставить его ждать, пока я не получу ответ. Как это сделать? Пользуюсь Single.
Мой подход с использованием getBlocking ();
public List<Data> getData() {
List<Data> data = new ArrayList<>();
Disposable disposable = repository.getDataFromApi(false)
.observeOn(AndroidSchedulers.mainThread())
.blockingGet();
.subscribe( newData -> {
data.addAll(newData);
}, __ -> { });
mCompositeDisposable.add(disposable);
//Here I want to stop till "Data" arraylist is filled with data
... do something with data
}
Там написано cannot resolve method subscribe, так что я, наверное, неправильно это называю ..
fun getDataFromApi(): Single<List<Data>> {
return service.getData()
.map { jsonApiObject ->
...
return@map data
}
}
Надеюсь, вы знаете, что блокировка - это сильный антипаттерн в RxJava, и вам следует избегать блокировки, когда это возможно.
Сказав это, если вам действительно нужно заблокировать, у вас есть два варианта:
используйте blockingGet(), который, как следует из названия, блокирует текущий поток и напрямую возвращает значение издателя (Single в вашем случае). Вероятно, это то, что вы искали. В твоем случае:
newData = repository.getDataFromApi(false).blockingGet();
data.addAll(newData);
синхронизировать с классами Java, такими как CountDownLatch - сложнее, и я бы использовал blockingGet(), потому что он более простой. Но это возможность.
Я обновил пост с вашими предложениями. Может быть, вы поможете мне исправить синтаксис вызова blockingGet (), так как я не могу об этом думать. Я добавил дополнительную информацию о своей реализации.