使用RxJava监控蓝牙连接的超时

时间:2017-02-02 23:11:47

标签: android bluetooth rx-java

在我的应用中,我使用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秒钟,我希望例程退出 - 以先到者为准。

虽然这段代码似乎有效。有更好的方法吗?

1 个答案:

答案 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
  )