현재 Bluetooth
장치에 대한 프로토콜을 구현 중이며 RxAndroidBle
라이브러리 (버전 1.4.3)를 사용 중입니다.첫 번째 방사에 의한 특성 표시 방출 횟수 결정
특성에 쓰고 특성 알림을 통해 응답을 듣는 방식으로 장치에서 데이터를 요청해야합니다.
내가의 코드를 사용하고 (쓰기, 듣기) 2 개 작업을 결합하려면 :이 방법은 나를 위해 작동 https://stackoverflow.com/a/41140523/734385connectionObservable
.flatMap(// when the connection is available...
rxBleConnection -> rxBleConnection.setupNotification(AP_SCAN_DATA), // ... setup the notification...
(rxBleConnection, apScanDataNotificationObservable) -> Observable.combineLatest(// ... when the notification is setup...
rxBleConnection.writeCharacteristic(AP_SCAN_DATA, writeValue), // ... write the characteristic...
apScanDataNotificationObservable.first(), // ... and observe for the first notification on the AP_SCAN_DATA
(writtenBytes, responseBytes) -> responseBytes // ... when both will appear return just the response bytes...
)
)
.flatMap(observable -> observable)
, 유일한 문제는 (코드 첫 번째 20 바이트 나에게 준다이다 apScanDataNotificationObservable.first()
으로 인해).
불행히도, 나는 받고있는 패키지의 크기를 알지 못합니다. 나는 처음 20 바이트의 머리말에서만 정보를 추출 할 수있다. 버퍼 기능이 모두 미리 크기를 알아야하는 것처럼 보입니다.
위의 코드를 Rx 체인의 일부로 사용하여이 작업을 정상적으로 수행 할 수있는 방법이 있습니까?
즉, Rx 체인의 첫 방출을 기준으로 방출 수를 제어 할 수 있습니까?
아니면 완전히 잘못된 접근이 있습니까?
덕분에, 내가 코드를 시도하고 내가 무엇입니까 전체 패키지,하지만 모든 방출을 수집 toList() 사용하려고했지만 내가 생각하기 때문에 그 이유는 takeUntil 포함되지 않습니다이며 그것은 마지막 방출 (따라서 또한 toList()) 그것이 유일한 방출 일 것 인 것에 따라 나는 원래의 코드를 사용하고, 방출을 모으기 위해 flatmap를 사용하고, 항상 Observable.empty를 돌려 주어서 그것을 위해 지금 해결했다() 마지막 배출까지 – tiqz
'Observable.takeUntil (Func1)'Javadoc :'이 연산자와이 함수의 차이점은 여기에 있습니다. 항목이 방출 된 후 조건이 평가됩니다. 그래서 나는 그것이 사실이라고 생각하지 않는다? 어쩌면 newResponseEndWatcher() 구현에 off-by-one 실수가있을 수 있습니까? –
@tiqz 더 자세한 정보가 필요하십니까? '.toList()'는 완료된'Observable'과'newResponseEndWatcher()'의 구현이 맞으면'apScanDataNotificationObservable.takeUntil (newResponseEndWatcher())'문제없이 완료해야합니다. –