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

时间:2015-05-07 06:30:12

标签: java android multithreading sensor android-sensors

我有一个简单的Android应用程序,它应该以特定的时间间隔从传感器获得多个读数 我目前有两个主题:

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

    < / LI>
  2. 一个工作线程,它在后台运行并通过主线程处理程序与主线程通信。

  3. 我的目的是保留关于何时在主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和DoneMeasurementCmd是简单的常量。

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

    1. 我可以在另一个线程中读取(然后简单地使用wait()来同步这个工作线程) - 基于这两个帖子:
    2. Android sensor registerListener in a separate thread

      A method for waiting for sensor data

      1. 或者,我可以在注册监听器之后简单地设置一个while循环并检查我可以在onSensorChanged方法中跳转的标志。由于工作线程在后台运行,所以可以阻止它,但我不喜欢我正在使用“忙”等待的事实。
      2. 我的问题是 - 有没有办法在同一个工作线程中获取读数,但没有在while循环中进行“忙”等待?或者上面的方法之一实际上是推荐的方法吗?

        谢谢!

1 个答案:

答案 0 :(得分:0)

如果我理解正确,可以阻止工作线程。那么你不需要一个单独的线程,只需将侦听器对象设为 monitor (即使用synchronized方法)并等待它。

例如,某些内容(粗略地描述了实际数据的处理):

class ListenerMonitor implements WhateverListenerInterface {

    private boolean gotData;
    ... some variable(s) to record the actual data

    public synchronized void onSensorChanged(...) {
        ...
        gotData=true;
        notifyAll();
    }

    public synchronized SuitableReturnType readSensor(...) throws InterruptedException {
        // register sensor event listener
        gotData = false;
        while(!gotData) wait();
        // unregister sensor event listener
        return the data?
    }   
}

并在工作线程中使用它:

...
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");