【问题标题】:Callback Hell: Sequencing RESTful Volley requests? RxAndroid?回调地狱:对 RESTful Volley 请求进行排序? RxAndroid?
【发布时间】:2016-09-15 23:53:29
【问题描述】:

我想看一个关于如何对异步(=非阻塞)RESTful Volley 请求链进行排序的 Android java 示例。

这就是 RxAndroid 的用途吗?

  • 如果是这样,我希望看到使用 RxAndroid 的示例。
  • 如果不是,我仍然希望看到一个没有潜入回调地狱的好例子!

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

我希望我的第一个请求的结果用于第二个请求。然后是我想在第三个请求中使用的第二个请求的结果。请问,我如何链接这样的 Volley 请求?

【问题讨论】:

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


    【解决方案1】:

    您可以使用 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());
        }
    }
    

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

    【讨论】:

    • 无论如何我可以将这个顺序异步调用与 LiveData 改造一起使用
    猜你喜欢
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 2017-05-08
    相关资源
    最近更新 更多