@Override
    public final Observable<T> run(final QueueReleaseInterface queueReleaseInterface) {

        return Observable.create(
                new ObservableOnSubscribe<T>() {
                    @Override
                    public void subscribe(ObservableEmitter<T> emitter) {
                        try {
                            protectedRun(emitter, queueReleaseInterface);
                        } catch (DeadObjectException deadObjectException) {
                            emitter.tryOnError(provideException(deadObjectException));
                            RxBleLog.e(deadObjectException, "QueueOperation terminated with a DeadObjectException");
                        } catch (Throwable throwable) {
                            emitter.tryOnError(throwable);
                            RxBleLog.e(throwable, "QueueOperation terminated with an unexpected exception");
                        }
                    }
                }
        );
    }
A function that returns this operation as an Observable.
When the returned observable is subscribed, this operation will be scheduled
to be run on the main thread. When appropriate the call to run() will be executed.
This operation is expected to call releaseRadio() at appropriate point after the run() was called.
rxandroidble/src/main/java/com/polidea/rxandroidble2/internal/QueueOperation.java