在我的应用中,我使用BluetoothSPP库连接到热敏打印机。我有一个活动,在启动时尝试自动连接到设备。
现在我有了这个工作,我想实现一个超时功能。我想使用RxJava我可以显示倒计时(5秒),然后向用户显示"重试"按钮如果时间过去了。这就是我到目前为止所拥有的:
protected void onAutoConnectStarted() {
count = 5;
countdown.setText( count.toString() );
countdown.setVisibility( View.VISIBLE );
retry.setVisibility( View.GONE );
Observable.interval( 1, TimeUnit.SECONDS )
.take( 5 )
.doOnNext( second -> {
if (bluetoothSPP.getServiceState() == BluetoothState.STATE_CONNECTED) {
throw new Exception("Break!");
}
})
.subscribeOn( Schedulers.newThread() )
.observeOn( AndroidSchedulers.mainThread() )
.subscribe( second -> {
count--;
countdown.setText( count.toString() );
countdown.setVisibility( View.VISIBLE );
retry.setVisibility( View.GONE );
}, error -> {
countdown.setVisibility( View.GONE );
retry.setVisibility( View.GONE );
// This is good, we can move on and do stuff
print();
}, () -> {
stopAutoConnect();
countdown.setVisibility( View.GONE );
retry.setVisibility( View.VISIBLE );
});
}
基本上,我想每秒更新一次计时器显示。除此之外,如果连接成功或者达到5秒钟,我希望例程退出 - 以先到者为准。
虽然这段代码似乎有效。有更好的方法吗?
答案 0 :(得分:1)
看起来你试图做的事情不在正确的地方。使用rxjava,您总是有一些不错的选择,但在您的情况下,您应该更好地更新计数器onNext()
,显示重试onError()
并继续成功的bt连接onCompleted()
。例如:
Observable
.interval(1, TimeUnit.SECONDS)
.takeUntil(__ -> isBluetoothConnected())
.takeUntil(Observable
.timer(5, TimeUnit.SECONDS)
.flatMap(timeout -> Observable.error(new TimeoutException())))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
secondsPassed -> updateCounter(), //every second
error -> stopConnectingAndShowRetry(), //timeout
() -> print() //bt connected
)