1

BLE 特性への書き込みを実行しています。これらの特定のデバイスでは、周辺機器がまだロックされている場合、特定の特性は書き込み可能ではありません。

例外がスローされるのではなく、デバイスがまだロックされているときにこれが呼び出された場合、視覚的な通知を提供したいと思います。

以下は、このアプリケーション用に作成したカスタム ライブラリのコードの最初の部分です。

public Observable<byte[]> setInterval(int interval) {
        if (!(interval > 0)) {
            return Observable.error(new IllegalArgumentException("Interval must be greater than 0."));
        }
        byte[] bytes = Utils.formatIntToBytes(interval);
        return mConnection.writeCharacteristic(Constants.INTERVAL, bytes)
                .doOnError(throwable -> Log.d(TAG, "call: Error writing to the interval characteristic"))
                .onErrorReturn(throwable -> {
                    return new byte[0];
                });
    }

そして、前のものを使用する方法は次のとおりです。

private void setInterval(int interval) {
       mDevice.setInterval(interval)
               .onErrorResumeNext(throwable -> {
                   return Observable.empty();
               })
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(new Subscriber<byte[]>() {
                   @Override
                   public void onCompleted() {

                   }

                   @Override
                   public void onError(Throwable e) {
                       e.printStackTrace();
                   }

                   @Override
                   public void onNext(byte[] bytes) {
                       if (bytes != null) {
                           Toast.makeText(DeviceDetailActivity.this, Utils.formatResponse(bytes), Toast.LENGTH_SHORT).show();
                       } else {
                           Toast.makeText(DeviceDetailActivity.this, "Seems to of been an error. Ensure the device is unlocked.", Toast.LENGTH_SHORT).show();
                       }
                   }
               });
    }

これは以前は単なる でしたが、実装されていることを明確に示すためにAction1に変更しました。SubscriberonError()

例外を防ぐために、余分な演算子 ( onErrorReturn(), ) を追加しました。onErrorResumeNext()

例外がまだ発生しているのはなぜですか?

編集:スタック トレース:

  java.lang.IllegalStateException: Exception thrown on Scheduler.Worker thread. Add `onError` handling.
      at rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:112)
      at android.os.Handler.handleCallback(Handler.java:739)
      at android.os.Handler.dispatchMessage(Handler.java:95)
      at android.os.Looper.loop(Looper.java:148)
      at android.app.ActivityThread.main(ActivityThread.java:5417)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
   Caused by: rx.exceptions.OnErrorNotImplementedException
      at rx.internal.util.InternalObservableUtils$ErrorNotImplementedAction.call(InternalObservableUtils.java:386)
      at rx.internal.util.InternalObservableUtils$ErrorNotImplementedAction.call(InternalObservableUtils.java:383)
      at rx.internal.util.ActionSubscriber.onError(ActionSubscriber.java:44)
      at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:152)
      at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:115)
      at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.checkTerminated(OperatorObserveOn.java:276)
      at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:219)
      at rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:107)
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:148) 
      at android.app.ActivityThread.main(ActivityThread.java:5417) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
   Caused by: BleGattException{status=8, bleGattOperation=BleGattOperation{description='CHARACTERISTIC_WRITE'}}
      at com.polidea.rxandroidble.internal.connection.RxBleGattCallback.propagateStatusErrorIfGattErrorOccurred(RxBleGattCallback.java:245)
      at com.polidea.rxandroidble.internal.connection.RxBleGattCallback.access$100(RxBleGattCallback.java:26)
      at com.polidea.rxandroidble.internal.connection.RxBleGattCallback$1.onCharacteristicWrite(RxBleGattCallback.java:110)
      at android.bluetooth.BluetoothGatt$1.onCharacteristicWrite(BluetoothGatt.java:407)
      at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:279)
      at android.os.Binder.execTransact(Binder.java:453)
4

0 に答える 0