Можно ли вызвать метод onSensorChanged в неосновном потоке с использованием RxJava? - PullRequest
0 голосов
/ 12 мая 2019

Я хочу вызвать метод "onSensorChanged" в неосновном потоке с использованием RxJava.

Вот мой код датчика.

    public class Accelerometer implements SensorEventListener {
    private Sensor linearAccelerSensor;

    static PublishSubject<SensorEvent> accelerData = PublishSubject.create();
    public static Observable<SensorEvent> getAccelerObservable(){ return accelerData; }

    public void initSensor(SensorManager sm){
        linearAccelerSensor = sm.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
        sm.registerListener(this,linearAccelerSensor,10000000);
    }


    @Override
    public void onSensorChanged(SensorEvent event) {
        if(event.sensor == linearAccelerSensor){
            Log.d("Accelerometer","Acclerometer onSensorchanged");
            Log.d("Accelerometer",Thread.currentThread().getName())
            accelerData.onNext(event);
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
}

И это код onStartCommand моей службы.

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    myCompositeDisposable.add(Accelerometer.getAccelerObservable()
            .observeOn(Schedulers.computation())
            .subscribeOn(Schedulers.io())
            .subscribeWith(new DisposableObserver<SensorEvent>() {
                @Override
                public void onNext(SensorEvent sensorEvent) {

                    //textViewAccel.setText(sensorEvent.toString());
                    Log.d("ServiceAccelerometer",sensorEvent.toString());

                    lAccX = sensorEvent.values[0];
                    lAccY = sensorEvent.values[1];
                    lAccZ = sensorEvent.values[2];

                    lAccX = Math.round(lAccX*100)/100.0;
                    lAccY = Math.round(lAccY*100)/100.0;
                    lAccZ = Math.round(lAccZ*100)/100.0;

                    double accel = Math.sqrt((lAccX * lAccX) + (lAccY * lAccY) + (lAccZ * lAccZ));
                    accel = Math.round(accel*100)/100.0;
                    //textViewAccel.setText(lAccX+" "+lAccY+" "+lAccZ);
                    Log.d("ServiceAccelerometer",String.valueOf(accel));


                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onComplete() {

                }
            })

    );
    return START_NOT_STICKY;
}

На самом деле я хотел подписать метод onSensorChanged () в моем файле службы.Однако метод onSensorChange () вернул только void, поэтому мне нужно создать другой метод, который возвращает Observable ().Поэтому я сделал getAccelerObservable (), который возвращает Observable.Но в этом процессе возникла проблема.

Метод onSensorChanged был вызван основным потоком, потому что я подписался на метод getAccelerObservable ().Однако я хочу вызвать метод onSensorChanged в другом потоке, за исключением mainThread.Как я могу исправить свой код?

1 Ответ

0 голосов
/ 12 мая 2019

OnSensorChanged не может быть вызван ни для одного потока, кроме основного.RxJava не может даже учитывать это - фреймворк вызывает это, а фреймворк не использует RxJava.Теперь вы можете сделать так, чтобы onSensorChange вызывал RxJava для передачи данных в другой поток из основного потока.Хорошая ли это идея или просто приведет к трэшу, зависит от того, сколько работы вы выполняете с результатом работы датчика, и нужно ли вам впоследствии обновлять пользовательский интерфейс.Это может привести к большей задержке и сбою между потоками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...