Вернуть отложенный тип из библиотеки Bluetooth Polidea - Kotlin Coroutines - PullRequest
0 голосов
/ 16 января 2019

Я провожу некоторые эксперименты с сопрограммами kotlin, в частности, я хотел бы вернуть моей сопрограмме RxBleDevice из библиотеки polidea . Однако функция Polidea scanBleDevices возвращает Disposable при подписке. Есть ли способ, согласно моему коду, вернуть моему Coroutine RxBleDevice?

Это мой код, на данный момент он не компилируется:

val scanDevices: Deferred<RxBleDevice> = GlobalScope.async {

            rxBleClient.scanBleDevices(ScanSettings.Builder()
                .build(), filterBuilder.setDeviceName(bikeBleName).build())
                .subscribe(
                    { scanResult ->
                        // Process scan result here.
                        scanResult.bleDevice
                    },
                    { throwable ->
                        // Handle an error here.
                    }
                )
        }

1 Ответ

0 голосов
/ 16 января 2019

Вам нужно заключить вызов метода subscribe в

suspendCancellableCoroutine< RxBleDevice>{ cont ->
  //your code here
}

блок. В реализации обратного вызова subscribe используйте cont.resume() для возобновления сопрограммы с результатом и cont.resumeWithException для возобновления с ошибкой.

Вы также можете связать отмену между сопрограммой и сканированием. Подробнее см. cont.invokeOnCancellation { }.

API, который вы вызываете, выглядит как Rx, может быть, один из этих модулей поможет https://github.com/Kotlin/kotlinx.coroutines/blob/master/reactive/README.md

...