android - RxJava2 - 同步执行调用

标签 android rx-java2

我有一个 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/

相关文章:

android - Rxjava 2 相机异常

java - 使用 RxJava 嵌套网络请求

java - 如何分别为每个ImageView添加onClickListener?

android - 如果适配器的数据通过 RxAndroid 设置,则 RecyclerView 在返回导航后滚动到顶部

java - fragment 替换错误

android - 统一注销谷歌玩游戏服务

android - 使用 Kotlin 扩展函数将 RxJava Observables 转换为实时数据

java - 如何使用 RxJava 2 的 CompositeDisposable?

android - Sonar Android Lint 未找到匹配问题

android - JavaMail 异常 : STOREDRV. Submission.Exception:OutboundSpamException