RxJava2 - выполнять вызов синхронно

У меня 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
            }
}
1
0
1 998
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Надеюсь, вы знаете, что блокировка - это сильный антипаттерн в RxJava, и вам следует избегать блокировки, когда это возможно.

Сказав это, если вам действительно нужно заблокировать, у вас есть два варианта:

  • используйте blockingGet(), который, как следует из названия, блокирует текущий поток и напрямую возвращает значение издателя (Single в вашем случае). Вероятно, это то, что вы искали. В твоем случае:

    newData = repository.getDataFromApi(false).blockingGet();
    data.addAll(newData);
    
  • синхронизировать с классами Java, такими как CountDownLatch - сложнее, и я бы использовал blockingGet(), потому что он более простой. Но это возможность.

Я обновил пост с вашими предложениями. Может быть, вы поможете мне исправить синтаксис вызова blockingGet (), так как я не могу об этом думать. Я добавил дополнительную информацию о своей реализации.

MaartinAndroid 05.10.2018 11:28

Другие вопросы по теме