我有一个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
}
}
答案 0 :(得分:2)
希望您知道阻塞在RxJava中是很强大的反模式,您应该尽可能避免阻塞。
说,如果您确实需要阻止,则有两个选择:
使用blockingGet()
-顾名思义-阻止当前线程并直接返回发布者的值(在您的情况下为Single
)。这可能是您想要的。就您而言:
newData = repository.getDataFromApi(false).blockingGet();
data.addAll(newData);
与Java类(例如CountDownLatch)同步-更加复杂,我将使用blockingGet()
,因为它更直接。但这是有可能的。