我有一个简单的Android应用程序,该应用程序应在特定时间间隔内从传感器获取多个读数。
我目前有两个线程:
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和DoneMeasurementCmd是简单的常量。
一旦工作线程接收到测量数据的请求,就需要注册一个传感器侦听器(上面的第一条注释行),但是随后它需要等待直到可以读取为止(上面的第二条注释行)。 读取可用后,它将取消注册侦听器(上面的第三条注释行),并向UI线程发送消息以通知新数据可用。 我可以想到两种方式来填充第二条评论行:
我可以读入另一个线程(然后简单地使用wait()同步此工作线程)-基于以下两个帖子:
另外,我可以在注册侦听器后简单地放置一个while循环,然后检查一个可以在onSensorChanged方法中触发的标志。 由于工作线程在后台运行,应该可以阻止它,但是我不喜欢我正在使用“忙”等待这一事实。
我的问题是-有没有一种方法可以在同一工作线程中获取读数,而无需在while循环中进行“繁忙”的等待? 还是上述方法之一实际上是推荐的方法?
谢谢!