繁体   English   中英

RxJava2-同步执行调用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM