当前位置: 首页 > 知识库问答 >
问题:

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

潘坚白
2023-03-14

我想在使用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) {

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

共有1个答案

夏侯俊美
2023-03-14

除了Main之外,不能在任何线程上调用OnSensorChanged。RxJava甚至不能考虑到它--框架调用它,而框架并不使用RxJava。现在您可以做的是让onSensorChange调用RxJava将数据从主线程推送到另一个线程。这是一个好主意还是只会导致麻烦,这取决于您对传感器结果做了多少工作,以及之后是否需要更新UI。这样做可能会导致更多的延迟和线程之间的混乱。

 类似资料:
  • 我使用的房间用于存储有关购物车详细信息。 我想删除主线程中的记录。我出错了 无法访问主线程上的数据库,因为它可能会长时间锁定 我检查了下面的链接,但没有帮助我 使用room(rxjava)执行删除 如何在android room和rxjava 2中插入数据并获取id作为out参数? 道阿ccess.java 应用班 我的异步任务正在工作 如何在RxJava中实现这一点。因为我的DAO删除返回无效?

  • 问题内容: 我想使用redis的pubsub传输一些消息,但不想使用阻止,例如以下代码: 最后一部分将被阻止。我只想检查给定频道中是否有数据,该如何完成?有没有类似的方法? 问题答案: 我认为那不可能。通道没有任何“当前数据”,您订阅了一个通道并开始接收该通道上其他客户端推送的消息,因此它是一个阻塞的API。另外,如果您查看pub / sub 的Redis Commands文档,将会更加清楚。

  • 问题内容: 我的一项活动遇到了一个奇怪的问题。从拍照/录像回来时,我正在显示一个对话框,允许用户命名相机。用户按下“确定”后,我将使用所请求的文件名发送给主题,该主题将复制文件(并显示进度对话框)。 由于某种原因,即使我调用,总是在主线程上调用执行复制的函数。 更改呼叫以解决问题。我还是想知道为什么它不起作用… 问题答案: 并且是那里最混乱的运营商。前者确保订阅副作用在指定的调度程序(线程)上发生

  • 问题内容: 好的,因此我们正在尝试将3D散点图合并到NetBeans 7.0中的项目中,而我们选择测试的库之一就是Jzy3D。看起来它可以完成我们需要做的所有事情,但是不幸的是,它什么也没做。 我已经正确安装了JOGL,并对其进行了测试并发现它可以正常工作。然后,我包含了与演示中相同的依赖项。我也尝试过直接包括.jars。是的,胶原- rt.jar在库文件夹中。 编辑: 为了使JOGL工作,我们不

  • 问题内容: 我正在为Android手机的客户端/服务器应用程序设计框架。我对Java和Android都相当陌生(但对于一般的编程(尤其是线程编程)不是新的)。 有时,我的服务器和客户端将处于同一进程中,有时它们将处于不同的进程中,具体取决于确切的用例。客户端和服务器接口如下所示: IServer.aidl: IClient.aidl: 现在,这里变得有趣了。我可以预见一些用例,在这些用例中,客户端

  • 问题内容: 我是Java新手,我想知道我是否具有以下典型的Java代码 JVM是否保证将始终运行finally块?为了了解我的来历,我已经习惯了C / C ++程序,如果您取消引用NULL指针,并且之后没有任何代码可以运行,它们可能会崩溃。 但是,据我了解Java和整个GC /托管内存业务的一般情况,没有诸如空指针取消引用之类的东西,所有这些都是可捕获的期望,因此,我的程序实际上没有崩溃的方法可能