在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的首选实现是什么。
根据你的评论,我认为你应该为此建立一个新的运营商。
此运算符将采用计算延迟的函数来应用于发射您的下一个项目
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);
}
}
};
}
}
}
你可以用
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