gpt4 book ai didi

retrofit - 正确使用 Retrofit + RxJava 的 combineLatest

转载 作者:行者123 更新时间:2023-12-04 11:50:36 28 4
gpt4 key购买 nike

我想异步执行 2 个网络调用 - 我正在使用 Retrofit+RxJava 来完成这个。这个逻辑来自一个简单的 Runner 类来测试解决方案。注意:这主要涉及服务器端的 RxJava。

我的代码如下所示:

public static void main(String[] args) throws Exception {
Api api = ...;

Observable.combineLatest(
api.getStates(),
api.getCmsContent(),
new Func2<List<States>, CmsContent, String>() {
@Override public String call(List<State> states, CmsContent content) {
...
return "PLACEHOLDER";
}
})
.observeOn(Schedulers.immediate())
.subscribeOn(Schedulers.immediate())
.subscribe(new Observer<String>() {
@Override public void onCompleted() {
System.out.println("COMPLETED");
}

@Override public void onError(Throwable e) {
System.out.println("ERROR: " + e.getMessage());
}

@Override public void onNext(String s) {
// I don't care what's returned here
}
});
}

三个问题:
  • Observable.combineLatest当您想要异步执行多个 REST 调用并在所有调用完成后继续时使用的最佳运算符?
  • 我的 Func2实现当前返回 String .在 2 个 API 调用执行后,我将处理 Func2#call() 中的结果。方法。我不在乎返回什么——不过,必须有更好的方法来处理这个问题——我说得对吗?
  • 使用上面的代码正确执行 API 调用。但是main方法没有以正确的方式完成 Process finished with exit code 0当我运行程序时。什么可能导致代码挂起?

  • 更新 - 2015-05-14

    根据建议,我已将逻辑更改为以下内容:
    public static void main(String[] args) throws Exception {
    Api api = ...;

    Observable.zip(
    api.getStates(),
    api.getCmsContent(),
    new Func2<List<States>, CmsContent, Boolean>() {
    @Override public Boolean call(List<State> states, CmsContent content) {
    // process data
    return true;
    }
    })
    .subscribeOn(Schedulers.io())
    .toBlocking()
    .first();
    }

    这看起来像我正在寻找的解决方案。我将使用它一段时间,看看我是否遇到任何麻烦。

    最佳答案

    1) 如果您知道在两条路径上都有一个值,那么它与 zip 一样好.

    2)你想做什么?您将在 Func2 中获得一对值如果您真的不关心 onNext 的旅行内容,返回您选择的值。

    3) Schedulers.immediate()从某种意义上说,它不是真正的调度程序,并且很容易出现同池死锁场景。你真的不需要使用它。如果你想阻塞主线程直到异步工作完成,使用 toBlocking().first()例如。

    关于retrofit - 正确使用 Retrofit + RxJava 的 combineLatest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30198927/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com