在RxJava中循环执行可变延迟之前和之后的函数
Execute function before and after variable delay in RxJava in a loop
我有一个现有的 Java 代码,我想在 RxJava 中编写它。我正在尝试使用自定义模式振动设备。
自定义模式的格式为 {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();
}
}
编辑
到目前为止,我已经通过以下方式实现了它,并且它按预期工作。有没有更优化的方案;
我 将数组拆分为 2 (onTime,offTime) 的元组,然后我发出这些,然后我在 Schedulers.computation()
线程
上执行所有操作
Observable.fromIterable(tuple).observeOn(Schedulers.io()).subscribeOn(Schedulers.computation()).subscribe(
t->{
//onNext Method
bluetoothIo.writeCharacteristic(Profile.UUID_SERVICE_VIBRATION, Profile.UUID_CHAR_VIBRATION, Protocol.VIBRATION_WITH_LED);
Thread.sleep(t[0]);
bluetoothIo.writeCharacteristic(Profile.UUID_SERVICE_VIBRATION, Profile.UUID_CHAR_VIBRATION, Protocol.STOP_VIBRATION);
Thread.sleep(t[1]);
},
e->e.printStackTrace(),
()->{//onComplete}
);
因此,给定此数组作为输入 {10,20,30,40,50},
我想按照下面的方式执行
function1
wait(10)
function2
wait(20)
function1
wait(30)
function2
wait(40)
function1
wait(50)
function2
你可以这样做。
- 创建表示开关延迟模式的 Flowable
- 创建一个具有相同大小的交替 true/false 布尔值的 Flowable,指示是否应该开启振动(或调用哪个方法)
- 将两个Flowable压缩在一起并生成一个Flowable of Flowables,其中每个嵌套的Flowable都采用开-关值并在
doOnNext(...)
中调用适当的方法
- 每个嵌套的 Flowable 随后将其自身的值延迟指定的延迟
- 最后,将嵌套的 Flowable 连接在一起
您应该可以 copy/paste 将其放入您的 IDE:
@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();
}
我有一个现有的 Java 代码,我想在 RxJava 中编写它。我正在尝试使用自定义模式振动设备。
自定义模式的格式为 {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();
}
}
编辑
到目前为止,我已经通过以下方式实现了它,并且它按预期工作。有没有更优化的方案;
我 将数组拆分为 2 (onTime,offTime) 的元组,然后我发出这些,然后我在 Schedulers.computation()
线程
Observable.fromIterable(tuple).observeOn(Schedulers.io()).subscribeOn(Schedulers.computation()).subscribe(
t->{
//onNext Method
bluetoothIo.writeCharacteristic(Profile.UUID_SERVICE_VIBRATION, Profile.UUID_CHAR_VIBRATION, Protocol.VIBRATION_WITH_LED);
Thread.sleep(t[0]);
bluetoothIo.writeCharacteristic(Profile.UUID_SERVICE_VIBRATION, Profile.UUID_CHAR_VIBRATION, Protocol.STOP_VIBRATION);
Thread.sleep(t[1]);
},
e->e.printStackTrace(),
()->{//onComplete}
);
因此,给定此数组作为输入 {10,20,30,40,50}, 我想按照下面的方式执行
function1
wait(10)
function2
wait(20)
function1
wait(30)
function2
wait(40)
function1
wait(50)
function2
你可以这样做。
- 创建表示开关延迟模式的 Flowable
- 创建一个具有相同大小的交替 true/false 布尔值的 Flowable,指示是否应该开启振动(或调用哪个方法)
- 将两个Flowable压缩在一起并生成一个Flowable of Flowables,其中每个嵌套的Flowable都采用开-关值并在
doOnNext(...)
中调用适当的方法
- 每个嵌套的 Flowable 随后将其自身的值延迟指定的延迟
- 最后,将嵌套的 Flowable 连接在一起
您应该可以 copy/paste 将其放入您的 IDE:
@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();
}