如果我没有记错的话...
如果您启动侦听器,您的代码将继续运行,并且当事件发生时它会触发侦听器。所以它是异步的。
我想做的是以这种方式包装整个代码,从外部代码来看它看起来像同步调用。
之前(伪代码)
listener:
oh, we just read temperature value
listener launch:
register listener for temperature
continue running
...
// somewhere here the temperature is read so we can obtain the value
...
后
先前代码的附加包装:
while (true)
Thread.sleep(1000)
if (is_temperature_read)
break;
并调用它:
temp = read_temperature()
令我惊讶的是,循环无限运行并且永远不会读取温度(即永远不会触发侦听器)。如果没有用这样的循环包装它,它就会被触发。
那么如何进行正确的包装呢?
更新 1/2:真实代码
现在,这是基于 Sherif elKhatib(所有错误都是我的)。
主要代码:
final Object lock = new Object();
听众的一部分:
@Override
public void onSensorChanged(SensorEvent event)
{
synchronized (lock)
{
read_value = event.values[0];
sensor_manager.unregisterListener(this,proximity_sensor);
lock.notifyAll();
}
}
等待听众:
synchronized (lock)
{
try
{
lock.wait();
}
catch (InterruptedException ex)
{
}
}
更新 2/2:从另一个线程调用
这不是解决方案,只是一个评论。如果我从临时创建的新线程中调用这个同步包装器,它不会陷入死锁。
所以可能还有其他东西锁定在代码之上。