RxJava2 - 同步执行调用

Pet*_*der 2 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        
}
Run Code Online (Sandbox Code Playgroud)

在 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        
}
Run Code Online (Sandbox Code Playgroud)

它说cannot resolve method subscribe,所以我可能把它称为错误的..

fun getDataFromApi(): Single<List<Data>> {
    return service.getData()
            .map { jsonApiObject ->
                ...
                return@map data
            }
}
Run Code Online (Sandbox Code Playgroud)

mic*_*brz 5

希望您意识到阻塞是 RxJava 中的强烈反模式,并且您应该尽可能避免阻塞。

也就是说,如果你确实需要阻止,你有两种选择:

  • 使用blockingGet()它 - 正如名称所示 - 阻止当前线程并直接返回发布者的值(Single在您的情况下)。这可能就是您正在寻找的。在你的情况下:

    newData = repository.getDataFromApi(false).blockingGet();
    data.addAll(newData);
    
    Run Code Online (Sandbox Code Playgroud)
  • 与 Java 类同步,例如CountDownLatch - 更复杂,我会使用blockingGet()它,因为它更简单。但这是一种可能性。