1

BLE デバイスのリストがあり、RxJava を使用してそれらとやり取りしています。リストからアイテムを発行し、X が発生するまで特性を繰り返し書き込み、リスト内の次のアイテムに進む必要があります。

現在のコード:

Observable.from(mDevices)
                .flatMap(new Func1<Device, Observable<?>>() {
                    @Override
                    public Observable<?> call(Device device) {
                        Log.d(TAG, "connecting for policing");
                        return device.connectForPolicing();
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<Object>() {
                    @Override
                    public void call(Object o) {
                        Log.d(TAG, "subscribing... ");
                    }
                });

次のようになり.connectForPolicing()ます。

public Observable<byte[]> connectForPolice() {

        ....

        return device.establishConnection(mContext, false)
                .flatMap(new Func1<RxBleConnection, Observable<byte[]>>() {
                    @Override
                    public Observable<byte[]> call(RxBleConnection rxBleConnection) {
                        byte[] value = new byte[1];
                        value[0] = (byte) (3 & 0xFF);
                        //Buzz the device
                        return rxBleConnection.writeCharacteristic(Constants.BUZZER_SELECT, value);
                    }
                })
                .repeat(3)//ignore
                .takeUntil(device.observeConnectionStateChanges().filter(new Func1<RxBleConnection.RxBleConnectionState, Boolean>() {
                    @Override
                    public Boolean call(RxBleConnection.RxBleConnectionState rxBleConnectionState) {

                        return rxBleConnectionState == RxBleConnection.RxBleConnectionState.DISCONNECTING;
                    }
                }));
    }

このコードは、リスト内のすべてのアイテムをすぐに発行するように見えるため、すべてのアイテムを同時に接続してバズさせます。一度に 1 つずつアイテムを放出して、それらとやり取りできるようにするにはどうすればよいですか?

擬似コードは次のようになります。

for(Device device : devices) {
    device.connect();
    while(device.isConnected()) {
        device.beep();
    }
}
4

2 に答える 2

1

flatMapと置き換えますconcatMap

.concatMap(device -> device.connectForPolicing())

flatMapmerge演算子を使用します。すぐにすべてのアイテムを放出します。while concatMapuses concat、それはアイテムを順番に放出します。それについての良い記事。

于 2016-11-18T00:00:01.930 に答える