回调地狱:排序RESTful排球请求? RxAndroid?

时间:2016-09-15 23:53:29

标签: android rest asynchronous android-volley rx-android

我希望看到一个Android java示例,说明如何对一系列异步(=非阻塞)RESTful Volley请求进行排序。

这是RxAndroid的用途吗?

  • 如果是这样,我希望看到使用RxAndroid的示例。
  • 如果没有,我仍然希望看到一个很好的例子,而不是潜入CALLBACK HELL!

我试过这样做但最终进入了CBHell: Need to send multiple Volley Requests - in a sequence

我希望第一次请求的结果能够用于第二次请求。然后我要在第3个请求中使用第二个请求的结果。请问,我如何将这些排球请求联系起来?

1 个答案:

答案 0 :(得分:3)

您可以使用Rx通过flatMap方法链接多个请求。

flatMap要求您返回选择类型的另一个Observable,从而允许您使用其他类型执行异步操作。

以下所有示例都是使用新的rx v2制作的。但所有方法和机制也适用于v1

示例:

final MyVolleyApi api = new MyVolleyApi();

api.getName()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(new Function<String, ObservableSource<Integer>>() {
    @Override
    public ObservableSource<Integer> apply(String name) throws Exception {
        return api.getAgeForName(name);
    }
})
.flatMap(new Function<Integer, ObservableSource<Date>>() {
    @Override
    public ObservableSource<Date> apply(Integer age) throws Exception {
        return api.getYearOfBirthForAge(age);
    }
})
.doOnError(new Consumer<Throwable>() {
    @Override
    public void accept(Throwable throwable) throws Exception {
        // handle the exception that occurred during one of the api calls
    }
})
.subscribe(new Consumer<Date>() {
    @Override
    public void accept(Date date) throws Exception {
        // do something with the 3rd argument here
    }
});

这是MyVolleyApi虚拟类:

public class MyVolleyApi {

    public Observable<String> getName() {
        return Observable.just("Rx");
    }

    public Observable<Integer> getAgeForName(String name) {
        return Observable.just(24);
    }

    public Observable<Date> getYearOfBirthForAge(int age) {
        return Observable.just(new Date());
    }
}

这可能适用于任何事情,它根本不是特定的