Java 等待传感器数据安卓-我们总是需要一个新的线程吗?

Java 等待传感器数据安卓-我们总是需要一个新的线程吗?,java,android,multithreading,sensors,android-sensors,Java,Android,Multithreading,Sensors,Android Sensors,我有一个简单的安卓应用程序,它应该在一定的时间间隔内从传感器获取多个读数。 我目前有两个线程: UI线程,它启动序列(通过发送给工作线程处理程序的消息),并跟踪其状态(无论我是在进行第一次测量还是重复测量) 工作线程,在后台运行,并通过主线程处理程序与主线程通信 我的意图是在主UI线程中保留关于何时进行测量的所有逻辑(这些是简单的数字比较,没有耗时的工作,因此应该适用于UI线程),并将工作线程设置为只知道如何响应从传感器读取数据的请求并返回读取结果的线程 我的问题在这个工作线程中。它通过消息接收

我有一个简单的安卓应用程序,它应该在一定的时间间隔内从传感器获取多个读数。
我目前有两个线程:

  • UI线程,它启动序列(通过发送给工作线程处理程序的消息),并跟踪其状态(无论我是在进行第一次测量还是重复测量)

  • 工作线程,在后台运行,并通过主线程处理程序与主线程通信

  • 我的意图是在主UI线程中保留关于何时进行测量的所有逻辑(这些是简单的数字比较,没有耗时的工作,因此应该适用于UI线程),并将工作线程设置为只知道如何响应从传感器读取数据的请求并返回读取结果的线程

    我的问题在这个工作线程中。它通过消息接收进行测量的请求,并在其handleMessage方法中处理该请求:

    public boolean handleMessage(Message msg) {
            if (msg.what == StartMeasurementCmd) {
                Log.d(TAG, "Starting measurement");
                // register sensor event listener
                // wait for onSensorChanged
                // unregister sensor event listener
                Log.d(TAG, "Measurement finished");
                // Notify UI thread via uiHandler
                Message newMsg = uiHandler.obtainMessage();
                newMsg.what = DoneMeasurementCmd;
                // add whatever information is needed to the newMsg
                newMsg.setTarget(uiHandler);
                newMsg.sendToTarget();
            }
            return false;
        }
    
    这里StartMeasurementCmd和doneMasurementCmd是简单的常量

    一旦工作线程接收到测量数据的请求,它需要注册一个传感器侦听器(上面的第一行注释),但它需要等待,直到读取可用(上面的第二行注释)。读取可用后,它将注销侦听器(上面的第三条注释行),并向UI线程发送消息,通知新数据可用。 我可以想出两种方法来填写第二条评论行:

  • 我可以在另一个线程中进行读取(然后简单地使用wait()来同步这个工作线程)——基于以下两个帖子:
  • 或者,我可以在注册侦听器之后简单地放置一个while循环,并检查一个标记,我可以在onSensorChanged方法中触发该标记。由于工作线程是在后台运行的,所以应该可以阻止它,但我不喜欢使用“忙”等待
  • 我的问题是-有没有一种方法可以在同一个工作线程中获取读数,但不执行“繁忙”的while等待循环?或者上述方法之一实际上是推荐的方法


    谢谢

    如果我理解正确,可以阻止工作线程。这样,您就不需要单独的线程,只需将侦听器对象设置为监视器(即使用
    synchronized
    方法)并等待即可

    例如,以下内容(大致描述了实际数据的处理):

    并在工作线程中使用它:

    ...
    ListenerMonitor listenerMonitor = new ListenerMonitor(...);
    ...
    public boolean handleMessage(Message msg) {
        if (msg.what == StartMeasurementCmd) {
            Log.d(TAG, "Starting measurement");
            ... = listenerMonitor.readSensor(...);
            Log.d(TAG, "Measurement finished");
    

    谢谢你的建议。由于listenerMonitor和readSensor都位于同一个线程中,wait()调用是否会阻止listenerMonitor执行其onSensorChanged方法?否,
    wait()
    在阻塞之前释放锁,然后确保在调用返回之前(调用
    notify()
    之后)重新获取锁。
    ...
    ListenerMonitor listenerMonitor = new ListenerMonitor(...);
    ...
    public boolean handleMessage(Message msg) {
        if (msg.what == StartMeasurementCmd) {
            Log.d(TAG, "Starting measurement");
            ... = listenerMonitor.readSensor(...);
            Log.d(TAG, "Measurement finished");