我有一個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;
}
}));
}
此代碼似乎立即發出列表中的所有項目,因此將連接並在同一嗡嗡的所有項目時間。我怎樣才能一次發出一件物品,以便我可以與他們互動?
僞代碼會是這樣的:
for(Device device : devices) {
device.connect();
while(device.isConnected()) {
device.beep();
}
}
我把文章讀。根據我的理解'.concatMap()'只是保留了項目的順序,但將'.flatMap()'切換到'.concatMap()'不會導致查找的阻塞行爲。如果兩個項目在列表中,他們都會讓我一個接一個排出。 – Orbit
它會,但每個項目都會等到device.connectForPolicing()完成前一個項目。 –
我試過了你的建議,雖然還沒有能夠獲得原始問題中描述的功能。至多,我可以讓一個設備發出嘟嘟聲,但不會重複。看着我的日誌,似乎只有一件事正在經歷。 – Orbit