【发布时间】:2017-12-07 15:03:55
【问题描述】:
我正在尝试订阅以在它发出项目时自动取消订阅。基本 observable 是这样创建的。
public static Observable<RxBleConnection> setupConnection(RxBleDevice device, PublishSubject<Void> disconnectTrigger) {
return device
.establishConnection(false)
.takeUntil(disconnectTrigger)
.retry(3)
.retryWhen(o -> o.delay(RETRY_DELAY, TimeUnit.MILLISECONDS))
.compose(new ConnectionSharingAdapter());
}
然后我尝试将三个读取操作组合成一个ProgramModel。
private void readCharacteristics(Action1<ProgramModel> onReadSuccess) {
mConnectionObservable
.flatMap(rxBleConnection ->
// combines the following three observables into a single observable that is
// emitted in onNext of the subscribe
Observable.combineLatest(
rxBleConnection.readCharacteristic(UUID_SERIAL_NUMBER),
rxBleConnection.readCharacteristic(UUID_MACHINE_TYPE),
rxBleConnection.readCharacteristic(UUID_CHARACTERISTIC),
ProgramModel::new))
.observeOn(AndroidSchedulers.mainThread())
.take(1)
.subscribe(programModel -> {
programModel.trimSerial();
onReadSuccess.call(programModel);
}, BleUtil::logError);
}
所以理论上一旦一个程序模型通过订阅的oNext来,订阅就会被取消订阅。由于某种原因,操作卡住了,并且永远不会调用 onNext 和 onError。如果我删除 take(1) 这工作正常,但我不想处理保留对订阅的引用并手动取消订阅。有谁知道我做错了什么或者为什么没有调用onNext?
【问题讨论】:
-
什么是
ConnectionSharingAdapter。个人readCharacteristics生产任何物品吗?将doOnNext放在各个地方,看看事件在哪里消失。 -
连接共享适配器是
RxAndroidBle的一部分。由于每次订阅都会创建一个与设备的连接,因此连接共享适配器基本上确保一次只有一个处于活动状态。我会试试doOnNext
标签: rx-java2 rxandroidble unsubscribe combinelatest