我已经使用Retrofit 2.0创建了两个不同的API请求
Observable<T> getOrganisationList()
Observable<T> getStaffList()
我正在使用CompositeDisposable
容器,可容纳多个其他一次性用品。我希望上述两个可观察请求仅按顺序执行(getStaffList()
之后getOrganisationList()
)且仅在以下情况下执行:
getOrganisationList()
不会将请求超时getOrganisationList()
在没有可用网络的情况下不会引发网络异常getOrganisationList()
通过在json对象中发送结果代码来表示会话超时getOrganisationList()
在解析结果时不会抛出JSONException
getOrganisationList()
不会返回null或空结果请在代码的帮助下回答问题。
答案 0 :(得分:3)
首先,如果您使用RxJava2和Retrofit2,请将Observable
替换为Single
。 Single
的结果只是一个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)的地方。我使用T
和String
来代替您的通用类型Integer
,以确保代码可以编译。