0

私はプロジェクトに RxAndroidBle を使用しています。ble デバイスからいくつかの特性を読み取り、それらを画面に表示する必要があります。以下のコードは、this::displayCharacteristics

private void readCharacteristics() {
    mConnectionObservable.flatMap(rxBleConnection -> Observable.combineLatest(
            rxBleConnection.readCharacteristic(UUID_SERIAL_NUMBER),
            rxBleConnection.readCharacteristic(UUID_MACHINE_TYPE),
            rxBleConnection.readCharacteristic(UUID_CHARACTERISTIC),
            ConnectedViewModel::new
            ).doOnError(this::logError)
    ).doOnError(this::logError)
    .subscribe(this::displayCharacteristics, this::logError);
}


private void displayCharacteristics(ConnectedViewModel model) {
    mSerialNumber.setText(model.getSerialNumber());
    mMachineType.setText(model.getMachineType());
    mCableLength.setText(model.getCableLength());
    mCableSize.setText(model.getCableSize());
    mUnits.setText(model.getUnits());
}

これは、CalledFromWrongThreadException実行時のためですthis::displayCharacteristics。フラグメントがオンになっているスレッドにデータを表示する適切な方法は何ですか? リスナーを使用する必要がありますか? ありがとう!

4

2 に答える 2

2

IO スレッドでデータを処理し、発行されたデータを UI スレッドに戻す必要があります。

それらのスケジューラを使用してそれを行うことができます。

private void readCharacteristics() {
    mConnectionObservable.flatMap(rxBleConnection -> Observable.combineLatest(
            rxBleConnection.readCharacteristic(UUID_SERIAL_NUMBER),
            rxBleConnection.readCharacteristic(UUID_MACHINE_TYPE),
            rxBleConnection.readCharacteristic(UUID_CHARACTERISTIC),
            ConnectedViewModel::new
            ).doOnError(this::logError)
    ).doOnError(this::logError)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(this::displayCharacteristics, this::logError);
}

また、これらすべての .doOnError() をどこでも使用することを避け、サブスクライバーで処理する必要があります (既に行ったように)。

于 2017-09-20T20:55:08.477 に答える