我有一个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)
希望您意识到阻塞是 RxJava 中的强烈反模式,并且您应该尽可能避免阻塞。
也就是说,如果你确实需要阻止,你有两种选择:
使用blockingGet()它 - 正如名称所示 - 阻止当前线程并直接返回发布者的值(Single在您的情况下)。这可能就是您正在寻找的。在你的情况下:
newData = repository.getDataFromApi(false).blockingGet();
data.addAll(newData);
Run Code Online (Sandbox Code Playgroud)与 Java 类同步,例如CountDownLatch - 更复杂,我会使用blockingGet()它,因为它更简单。但这是一种可能性。
| 归档时间: |
|
| 查看次数: |
3025 次 |
| 最近记录: |