在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

你可以这样做。

  1. 创建表示开关延迟模式的 Flowable
  2. 创建一个具有相同大小的交替 true/false 布尔值的 Flowable,指示是否应该开启振动(或调用哪个方法)
  3. 将两个Flowable压缩在一起并生成一个Flowable of Flowables,其中每个嵌套的Flowable都采用开-关值并在doOnNext(...)
  4. 中调用适当的方法
  5. 每个嵌套的 Flowable 随后将其自身的值延迟指定的延迟
  6. 最后,将嵌套的 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();
}