是否可以使用RxJava在非主线程中调用“ onSensorChanged”方法?

时间:2019-05-12 03:33:34

标签: java android rx-java android-sensors

我想使用RxJava在非主线程中调用“ onSensorChanged”方法。

这是我的传感器代码。

    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;
}

实际上,我想在我的Service文件中订阅onSensorChanged()方法。 但是,onSensorChange()方法仅返回void,因此我需要制作另一个返回Observable()的方法。 因此,我使getAccelerObservable()返回了Observable。 但是在此过程中出现了问题。

主线程调用了

onSensorChanged方法,因为我订阅了getAccelerObservable()方法。但是,我想在除mainThread之外的其他线程中调用onSensorChanged方法。 我该如何更正我的代码?

1 个答案:

答案 0 :(得分:0)

OnSensorChanged不能在除main之外的任何线程上调用。 RxJava甚至无法将其纳入其中-框架调用了该框架,并且该框架未使用RxJava。现在您可以执行的是onSensorChange调用RxJava将数据从主线程推送到另一个线程。这是一个好主意还是会导致崩溃,这取决于您要对传感器结果进行多少工作,以及是否需要随后更新UI。这样做可能会导致更多的延迟和线程之间的抖动。