【问题标题】:Rxjava Observe stream as List for Specific timeRxjava 观察流作为特定时间的列表
【发布时间】:2017-08-01 11:33:06
【问题描述】:

我想做什么?

我有一个 observable(dayListener) 在我第一次订阅它时从服务器发出 100 - 300 个项目(未确认可能不返回任何内容),然后在 1 小时后返回 1 个项目。每个项目的类型都是 UserData

什么是问题?

我想从 (dayListner) 观察项目 3 秒并将其转换为 List 并存储它,然后继续观察单个项目的相同 observable UserData

我的尝试

我无法弄清楚如何在 rxjava 2 中将 observable 转换为 3 秒,因为我无法为相同的 observable 返回两种类型 UserDataList ,所以我我无法形成解决方案任何真正值得赞赏的想法! , 我只是 rxjava 2 的新手

【问题讨论】:

  • 你检查Buffer operator了吗?
  • 是的,我确实检查了那个操作符,但是当我在获得第一个发出的项目列表后观察单个项目时会发生什么混乱,并且缓冲区是有风险的操作符,它有时会丢弃项目
  • 好吧,你根本做不到。 Observable 发出单一类型,因此您不能同时发出列表和简单项目。您有一些解决方法,例如发出单个项目的列表或发出类似 Either 的列表或项目

标签: android arraylist listener rx-java rx-java2


【解决方案1】:

只需使用 2 个不同的 Observable,无论如何您都想监听 2 种不同类型的数据。

第一个 Observable 应该有 3 秒的限制:

firstListObservable = userSourceObservable .takeUntil(Observable.timer(3, TimeUnit.SECONDS)) .toList()

然后你就有了其余值的 Observable:

remainingValuesObservable = userSourceObservable .skipUntil(Observable.timer(3, TimeUnit.SECONDS))

这是你想要的吗?

【讨论】:

  • 谢谢你让我知道如何处理这种情况
【解决方案2】:

您可以创建一个 Pair 类并使用 Zip 运算符将两个结果合并为一个 emmited Item

class Pair {
        String a;
        Integer b;

        Pair(String a, Integer b) {
            this.a = a;
            this.b = b;
        }
    }

    @Test
    public void testZipDifferentTypes() {
        Observable.zip(obA(), obB(), Pair::new)
                .subscribe(System.out::println);
    }

    private Observable<String> obA() {
        return Observable.just("hello");
    }

    private Observable<Integer> obB() {
        return Observable.just(1);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多