Java 等待传感器数据安卓-我们总是需要一个新的线程吗?
我有一个简单的安卓应用程序,它应该在一定的时间间隔内从传感器获取多个读数。Java 等待传感器数据安卓-我们总是需要一个新的线程吗?,java,android,multithreading,sensors,android-sensors,Java,Android,Multithreading,Sensors,Android Sensors,我有一个简单的安卓应用程序,它应该在一定的时间间隔内从传感器获取多个读数。 我目前有两个线程: UI线程,它启动序列(通过发送给工作线程处理程序的消息),并跟踪其状态(无论我是在进行第一次测量还是重复测量) 工作线程,在后台运行,并通过主线程处理程序与主线程通信 我的意图是在主UI线程中保留关于何时进行测量的所有逻辑(这些是简单的数字比较,没有耗时的工作,因此应该适用于UI线程),并将工作线程设置为只知道如何响应从传感器读取数据的请求并返回读取结果的线程 我的问题在这个工作线程中。它通过消息接收
我目前有两个线程:
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线程发送消息,通知新数据可用。
我可以想出两种方法来填写第二条评论行:
谢谢 如果我理解正确,可以阻止工作线程。这样,您就不需要单独的线程,只需将侦听器对象设置为监视器(即使用
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");