在循环中RxJava中变量延迟前后执行函数
我有一个现有的Java代码,我想用RxJava编写。我正试图用一个自定义的模式振动一个设备 自定义模式的格式为在循环中RxJava中变量延迟前后执行函数,java,android,rx-java,reactive-programming,rx-android,Java,Android,Rx Java,Reactive Programming,Rx Android,我有一个现有的Java代码,我想用RxJava编写。我正试图用一个自定义的模式振动一个设备 自定义模式的格式为{onTime1,offTime1,onTime2,offTime2…}其中, 设备在下一次振动之前,会振动onTime毫秒,并等待offTime 以下是我的Java代码: for (int i = 0; i < customPattern.length - 1; i++) { try { io.writeCharacteri
{onTime1,offTime1,onTime2,offTime2…}
其中,
设备在下一次振动之前,会振动onTime
毫秒,并等待offTime
以下是我的Java代码:
for (int i = 0; i < customPattern.length - 1; i++) {
try {
io.writeCharacteristic(Profile.UUID_SERVICE_VIBRATION, Profile.UUID_CHAR_VIBRATION, this.getProtocol());
Thread.sleep(customPattern[i]);
io.writeCharacteristic(Profile.UUID_SERVICE_VIBRATION, Profile.UUID_CHAR_VIBRATION, Protocol.STOP_VIBRATION);
Thread.sleep(customPattern[i + 1]);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
给定这个数组作为输入{10,20,30,40,50},
我想以以下方式执行
function1
wait(10)
function2
wait(20)
function1
wait(30)
function2
wait(40)
function1
wait(50)
function2
你可以这样做
doOnNext(…)
@Test
public void testVibrate()
{
// Delay pattern:
Flowable<Integer> pattern = Flowable.just(
500, // on
250, // off
500, // on
250, // off
1000, // on
0 ); // off
// Alternating true/false booleans:
Flowable<Boolean> onOff = pattern
.scan(
true, // first value
( prevOnOff, delay ) -> !prevOnOff ); // subsequent values
// Zip the two together
pattern.zipWith( onOff, ( delay, on ) -> Flowable.just( on )
.doOnNext( __ -> System.out.println( "vibrate: " + on )) // Invoke function based on value
.delay( delay, TimeUnit.MILLISECONDS )) // Delay the value downstream
.concatMap( on -> on ) // Concatenate the nested flowables
.ignoreElements()
.blockingAwait();
}
@测试
公共无效测试振动()
{
//延迟模式:
可流动模式=可流动(
500,//on
250,//关
500,//on
250,//关
1000,//on
0);//关
//交替使用真/假布尔值:
可流动onOff=模式
.扫描(
true,//第一个值
(prevOnOff,delay)->!prevOnOff);//后续值
//把这两个拉链拉在一起
pattern.zipWith(onOff,(delay,on)->可流动。just(on)
.doOnNext(_->System.out.println(“振动:+on))//基于值调用函数
.delay(delay,TimeUnit.millides))//延迟下游的值
.concatMap(on->on)//连接嵌套的流
.ignoreElements()
.阻塞等待();
}
您能否提供更多关于为什么必须使用Flowables的详细信息,并强调我的方法和您的方法之间的差异,例如为什么一种方法优于另一种方法other@struct_dhancha通过调用Thread::sleep
可以有效地从底层线程池中取出一个线程。它还可以用于在应用程序中执行其他一些工作负载。在这种情况下,它是可流动的还是可观察的并不重要。您可以将其更改为可观察的
。使用延迟运算符会将一个值的发射延迟给定的时间段,对吗?因此,假设第一个值是(500ms,true)
,那么在延迟500s后将调用onNext方法,并且由于on
值是true
,因此在延迟500s后将调用振动函数。我想要的是立即调用振动函数,然后等待500秒,然后调用停止函数…@struct_dhancha延迟操作符影响下游。第一次调用doOnNext立即发生。@struct_dhancha是的,没错。您最终得到了一个嵌套的可流动,执行doOnNext
,然后是一个延迟。然后,您将concatMap
嵌套的Flowables
,生成一个Flowables
的Booleans
,您可以订阅,但忽略值本身。
@Test
public void testVibrate()
{
// Delay pattern:
Flowable<Integer> pattern = Flowable.just(
500, // on
250, // off
500, // on
250, // off
1000, // on
0 ); // off
// Alternating true/false booleans:
Flowable<Boolean> onOff = pattern
.scan(
true, // first value
( prevOnOff, delay ) -> !prevOnOff ); // subsequent values
// Zip the two together
pattern.zipWith( onOff, ( delay, on ) -> Flowable.just( on )
.doOnNext( __ -> System.out.println( "vibrate: " + on )) // Invoke function based on value
.delay( delay, TimeUnit.MILLISECONDS )) // Delay the value downstream
.concatMap( on -> on ) // Concatenate the nested flowables
.ignoreElements()
.blockingAwait();
}