如何使用RxJava2创建2或2个连续网络请求?

时间:2017-06-01 19:32:55

标签: android rx-java retrofit2 rx-java2

我已经使用Retrofit 2.0创建了两个不同的API请求

Observable<T> getOrganisationList()
Observable<T> getStaffList()

我正在使用CompositeDisposable容器,可容纳多个其他一次性用品。我希望上述两个可观察请求仅按顺序执行(getStaffList()之后getOrganisationList())且仅在以下情况下执行:

  1. getOrganisationList()不会将请求超时
  2. getOrganisationList()在没有可用网络的情况下不会引发网络异常
  3. getOrganisationList()通过在json对象中发送结果代码来表示会话超时
  4. getOrganisationList()在解析结果时不会抛出JSONException
  5. getOrganisationList()不会返回null或空结果
  6. 请在代码的帮助下回答问题。

1 个答案:

答案 0 :(得分:3)

首先,如果您使用RxJava2和Retrofit2,请将Observable替换为SingleSingle的结果只是一个onSuccess()或一个onError()方法调用。 Observable更通用。

public void func() {
    Disposable disposable = Single.concat(getOrganisationList(), getStaffList())
            .subscribe(result -> {
                // called twice, when organisation call succeeded and when staff call succeeded
            }, throwable -> {
                // handle exceptions you want
                if (throwable instanceof NullPointerException) {
                    // organisation - empty or null; staff - null
                } // else if(throwable instanceof IOException) ...
            });
}

public Single<List<String>> getOrganisationList() {
    return Single.just(Collections.singletonList("Hello")) // (1)
            .map(organizations -> {
                if (organizations.isEmpty()) {
                    throw Exceptions.propagate(new NullPointerException("List is empty"));
                }
                return organizations;
            }).doOnSuccess(organizations -> {
                // do something with organizations list
            });
}

public Single<List<Integer>> getStaffList() {
    return Single.just(Collections.<Integer>emptyList()) // (2)
            .doOnSuccess(organizations -> {
                // do something with staff list
            });
}

您应该将API调用添加到标记为(1)和(2)的地方。我使用TString来代替您的通用类型Integer,以确保代码可以编译。