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

在RxJava中以取决于所发射项目本身的间隔发射项目

胥宏义
2023-03-14

在RxJava for Android中,我希望以一个取决于项目本身的时间间隔发出项目:在Observable中,我从队列中提取一个项目,对其进行处理并发出它。根据项目的类型,我想调整下一个项目的发射时间(减慢或加快间隔)。

下面的代码是@a.bertucci在这里提出的,它使用Android上的RxJava以固定的时间间隔在UI中发出绘制对象,演示了如何以固定的时间间隔发出项目。

private void drawPath(final String chars) {
    Observable.zip(
        Observable.create(new Observable.OnSubscribe<Path>() {
            // all the drawing stuff here
            ...
        }),
        Observable.timer(0, 50, TimeUnit.MILLISECONDS),
        new Func2<Path, Long, Path>() {
            @Override
            public Path call(Path path, Long aLong) {
                return path;
            }
        }
    )
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())
    ...
}

我现在的问题是,当可观察物发射时,是否有可能修改发射频率,以及使用RxJava的首选实现是什么。

共有2个答案

云俊美
2023-03-14

根据你的评论,我认为你应该为此建立一个新的运营商。

此运算符将采用计算延迟的函数来应用于发射您的下一个项目

 Observable.range(1, 1000).lift(new ConfigurableDelay((item) -> 3 SECONDS)
                          .subscribe();

你可以试试这样:

public class ConfDelay {

public static void main(String[] args) {
    Observable.range(1, 1000).lift(new ConfigurableDelay(ConfDelay::delayPerItem, Schedulers.immediate()))
            .map((i) -> "|")
            .subscribe(System.out::print);
}


public static TimeConf delayPerItem(Object item) {
    long value = ((Integer) item).longValue();
    return new TimeConf(value * value, TimeUnit.MILLISECONDS);
}

private static class TimeConf {
    private final long time;
    private final TimeUnit unit;

    private TimeConf(final long time, final TimeUnit unit) {
        this.time = time;
        this.unit = unit;
    }
}

private static class ConfigurableDelay<T> implements Observable.Operator<T, T> {
    private final Func1<T, TimeConf> itemToTime;
    private final Scheduler scheduler;

    public ConfigurableDelay(final Func1<T, TimeConf> itemToTime) {
        this(itemToTime, Schedulers.computation());
    }

    public ConfigurableDelay(final Func1<T, TimeConf> itemToTime, final Scheduler scheulder) {
        this.itemToTime = itemToTime;
        this.scheduler = scheulder;
    }

    @Override
    public Subscriber<? super T> call(final Subscriber<? super T> subscriber) {
        return new Subscriber<T>(subscriber) {

            private TimeConf nextTime = null;

            @Override
            public void onCompleted() {
                subscriber.onCompleted();
            }

            @Override
            public void onError(final Throwable e) {
                subscriber.onError(e);
            }

            @Override
            public void onNext(final T t) {
                TimeConf previousNextTime = nextTime;
                this.nextTime = itemToTime.call(t);
                if (previousNextTime == null) {
                    subscriber.onNext(t);
                } else {
                    scheduler.createWorker().schedule(() -> subscriber.onNext(t), previousNextTime.time, previousNextTime.unit);
                }
            }
        };
    }
}
}
督阿苏
2023-03-14

你可以用

 public final <U, V> Observable<T> delay(
            Func0<? extends Observable<U>> subscriptionDelay,
            Func1<? super T, ? extends Observable<V>> itemDelay)

public final <U> Observable<T> delay(Func1<? super T, ? extends Observable<U>> itemDelay)

您可以使用itemDelay来控制速度。

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

  • 我有一个可观察的,它正在监听数据库,并在将其添加到数据库时发出项。当我订阅这个可观察对象时,它会一个接一个地发出快速存储在db中的项目。我的问题是,我是否可以创建observable来收集以特定间隔(例如100毫秒)发射到列表中的项目,并发射(或在某些函数中返回,如doOnNext)整个列表和单独的项目(如果以更大的间隔发射)? 提前感谢!

  • 为了配置一个简单的JPA项目,我使用了Wildfly 8,数据源是在单机版中配置的。xml。 在Web项目中,我配置了持久性。像这样的xml文件 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 但是,当我添加br时。通用域名格式。卖应用程序。奥姆。通常,我在项目启动时出错,该错误表示存在hibernate问题org/hiber

  • 我有一个方法返回一个

  • 本文向大家介绍Android开发之关于项目,包括了Android开发之关于项目的使用技巧和注意事项,需要的朋友参考一下 本系列文章会根据项目的进度进行相关介绍,其会分为多个模块,每个模块互不依赖,各个模块都是单独的学习内容,如sqlite学习模块,contacts联系人模块等。 新建项目 相信大部分童鞋都可以自定义项目了,那么在此,我简单介绍下android studio新建项目的过程。 最终,a

  • 默认 Library 只会发布 release variant(变种)版本。该版本将会被所有引用它的项目使用,无论编译出多少个版本。由于 Gradle 的限制,我们正在努力解决这个问题。你可以控制哪一个 Variant 版本作为发行版: android { defaultPublishConfig "debug" } 注意这里的发布配置对应的值是完整的 variant 版本名称。reles