我有一个 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
}
它说无法解析方法订阅
,所以我可能调用它是错误的..
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()
因为它更简单。但这是有可能的。
关于android - RxJava2 - 同步执行调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52661708/