Android BLE RxKotlin

Я пытаюсь создать службу BLE, которая будет сканировать устройства, и с помощью rxKotlin создать наблюдаемый объект, который позволит другому классу наблюдать за обнаружением устройства. Я запутался в том, как создать наблюдаемое, которое позволит подписаться другому классу, и учебники повсюду. Может ли кто-нибудь дать мне указатель на то, как это сделать или хороший учебник.

Обратный вызов класса Bluetoothservice, в котором обнаруживаются устройства

var foundDeviceObservable: Observable<BluetoothDevice> = Observable.create {  }

private val scanCallback = object : ScanCallback() {
    override fun onScanResult(callbackType: Int, result: ScanResult) {
        with(result.device) {
            var foundName = if (name == null) "N/A" else name
            foundDevice = BluetoothDevice(
                foundName,
                address,
                address,
                result.device.type.toString()
            )
            foundDeviceObservable.subscribe {
               //Update Observable value?
            }
        }
    }
}

class DeviceListViewModel(application: Application) : AndroidViewModel(application) {
    private val bluetoothService = BLEService()

    //Where I am trying to do logic with device
    fun getDeviceObservable(){
        bluetoothService.getDeviceObservable().subscribe{ it ->
        
    }
}

Решение

Смог найти решение после прочтения ответа пользователя 4097210. Просто пришлось изменить найденное устройство на

var foundDeviceObservable: BehaviorSubject<BluetoothDevice> = BehaviorSubject.create()

а затем вызовите следующий метод в обратном вызове

private val scanCallback = object : ScanCallback() {
    override fun onScanResult(callbackType: Int, result: ScanResult) {
        with(result.device) {
            var foundName = if (name == null) "N/A" else name
            foundDevice = BluetoothDevice(
                foundName,
                address,
                address,
                result.device.type.toString()
            )
            foundDeviceObservable.onNext(foundDevice)
        }
    }
}

person Ubarjohade    schedule 28.04.2021    source источник


Ответы (1)


использовать BehaviorSubject

// create a BehaviorSubject
var foundDeviceObservable: BehaviorSubject<BluetoothDevice> = BehaviorSubject()

// call onNext() to send new found device
foundDeviceObservable.onNext(foundDevice)

// do your logic use foundDeviceObservable
foundDeviceObservable.subscribe(...)
person user4097210    schedule 28.04.2021
comment
Благодарю вас! Благодаря этому удалось найти решение и хорошо выспаться. А затем просто верните foundDeviceObservable в функцию get. Мне придется исследовать больше rxkotlin, я не понимал, что BehaviorSubject - это то, что нужно. - person Ubarjohade; 30.04.2021