RxJava2 - выполнить вызов синхронно - PullRequest
0 голосов
/ 05 октября 2018

У меня есть 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 голосов
/ 05 октября 2018

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

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

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

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

...