[英]RxJava2 - execute call synchronously
我有一个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
}
}
希望您知道阻塞在RxJava中是一个强大的反模式,并且您应尽可能避免阻塞。
话虽如此,如果您确实需要阻止,则有两个选择:
使用blockingGet()
-顾名思义-阻止当前线程并直接返回发布者的值(在您的情况下为Single
)。 这可能是您想要的。 在您的情况下:
newData = repository.getDataFromApi(false).blockingGet(); data.addAll(newData);
与CountDownLatch之类的Java类同步-更复杂,我将使用blockingGet()
因为它更直接。 但这是有可能的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.