当前位置: 首页 > 知识库问答 >
问题:

RxJava改造,获取列表并为每个项目添加额外信息

呼延原
2023-03-14

我在玩RXJava,在Android系统中改装。我正在努力实现以下目标:

我需要定期调查一个电话,给我一个可观察的

一旦我得到这个列表,我想在每个交付迭代,并调用另一个方法,将给我的ETA(所以只是更多的信息)我想把这个新的信息附加到交付中,并返回完整的列表与附加到每个额外的信息项目。

一旦我得到了列表,我知道在没有rxjava的情况下如何做到这一点,但我想练习一下。

这是我目前的代码

pollDeliveries = Observable.interval(POLLING_INTERVAL, TimeUnit.SECONDS, Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR))
            .map(tick -> RestClient.getInstance().getApiService().getDeliveries())
                    .doOnError(err -> Log.e("MPB", "Error retrieving messages" + err))
                    .retry()
                    .subscribe(deliveries -> {
                        MainApp.getEventBus().postSticky(deliveries);
                    });

这是给我的送货单。现在我想完成第二部分。

希望我说得够清楚。谢谢

共有2个答案

梁骞仕
2023-03-14

我没有花太多时间使用Java8Lambdas,但下面是一个将每个对象映射到不同对象的示例,然后获得一个列表

List<Delivery> deliveries = ...;
Observable.from(deliveries).flatMap(new Func1<Delivery, Observable<ETA>>() {
    @Override
    public Observable<ETA> call(Delivery delivery) {
        // Convert delivery to ETA...
        return someEta;
    }
})
.toList().subscribe(new Action1<List<ETA>>() {
    @Override
    public void call(List<ETA> etas) {

    }
});

当然,最好能看到改装响应(可能是可见的)

要做到这一点,您可以改为这样做(使用lambdas会更好)。您将替换可观察的。从(交付)在上述示例中,具有以下内容:

apiService.getDeliveries().flatMap(new Func1<List<Delivery>, Observable<Delivery>>() {
    @Override
    public Observable<Delivery> call(List<Delivery> deliveries) {
        return Observable.from(deliveries);
    }
}).flatMap(...)

蓬思博
2023-03-14

最后我找到了一个很好的方法。

private void startPolling() {
    pollDeliveries = Observable.interval(POLLING_INTERVAL, TimeUnit.SECONDS, Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR))
            .flatMap(tick -> getDeliveriesObs())
            .doOnError(err -> Log.e("MPB", "Error retrieving messages" + err))
            .retry()
            .subscribe(this::parseDeliveries, Throwable::printStackTrace);
}

private Observable<List<Delivery>> getDeliveriesObs() {
    return RestClient.getInstance().getApiService().getDeliveries()
            .flatMap(Observable::from)
            .flatMap(this::getETAForDelivery)
            .toSortedList((d1, d2) -> {
                if (d1.getEta() == null) {
                    return -1;
                }
                if (d2.getEta() == null) {
                    return 1;
                }
                return d1.getEta().getDuration().getValue() > d2.getEta().getDuration().getValue() ? 1 : -1;
            });
}

让我们一步一步走。

  1. 首先,我们创建一个Observable,它在每次轮询间隔时间触发getDeliveriesSobs()方法,该方法将返回最终列表

它工作正常,非常好,我开始喜欢rxjava:)

 类似资料:
  • 我有一个方法返回一个

  • 我试图通过将多个改型api调用链接在一起来创建一个可观察的api。这些步骤是: 使用api调用获取json对象列表 对于列表中的每个对象,进行另一个api调用以获取有关该项目的更多详细信息 将从这个新的详细对象中获取的数据写入磁盘上的文件(列表中的每个项目都会出现这种情况) 最后返回一个单独对象的可观察性,该对象要求为之前的每个对象创建一个文件 这是我到目前为止所拥有的: 请有人确认我使用了正确的

  • 我正在使用改造从REST服务获取数据。在接收json(对象列表)后,我想为列表上的每个位置获取位图。最好的方法是什么?我试图在改造后创建的可观察对象上使用地图/平面地图,但它不起作用(或者,可能是我做错了)。 改造接口方法: 使用方法: 当我试图使用平板地图()或地图()时,它总是返回一个列表,但我需要每个项目单独。 任何帮助都将不胜感激!

  • 执行 gradle projects 命令会为你列出子项目名称列表. 例 11.7. 收集项目信息 gradle -q projects 命令的输出结果 > gradle -q projects ------------------------------------------------------------ Root project ----------------------------

  • 问题内容: 我正在努力实现我认为在Rx中相当简单的东西。 我有一个项目列表,我想延迟每个项目的发出。 似乎Rx delay()运算符只是将所有项目的发射偏移指定的延迟,而不是每个单独的项目。 这是一些测试代码。它将列表中的项目分组。然后,每个组应在发出之前应用延迟。 结果是: 但是我希望看到的是这样的: 我究竟做错了什么? 问题答案: 一种方法是将可观察值与可观察值结合起来以延迟输出。

  • 执行 gradle properties 可以获取项目所有属性列表. 如下例: 例 11.16. 属性信息 gradle -q api:properties 的输出结果 > gradle -q api:properties ------------------------------------------------------------ Project :api - The shared A