RxJava2-同步执行调用

时间:2018-10-05 08:45:10

标签: android rx-java2

我有一个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 :(得分:2)

希望您知道阻塞在RxJava中是很强大的反模式,您应该尽可能避免阻塞。

说,如果您确实需要阻止,则有两个选择:

  • 使用blockingGet()-顾名思义-阻止当前线程并直接返回发布者的值(在您的情况下为Single)。这可能是您想要的。就您而言:

    newData = repository.getDataFromApi(false).blockingGet();
    data.addAll(newData);
    
  • 与Java类(例如CountDownLatch)同步-更加复杂,我将使用blockingGet(),因为它更直接。但这是有可能的。