4

如果我没有记错的话...

如果您启动侦听器,您的代码将继续运行,并且当事件发生时它会触发侦听器。所以它是异步的。

我想做的是以这种方式包装整个代码,从外部代码来看它看起来像同步调用。

之前(伪代码)

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:从另一个线程调用

这不是解决方案,只是一个评论。如果我从临时创建的新线程中调用这个同步包装器,它不会陷入死锁。

所以可能还有其他东西锁定在代码之上。

4

1 回答 1

2

你应该锁定线程(如果这是你想要的)

这是代码(我没有测试,所以它可能在这里或那里需要一些东西)

public wrapperFunction() {
    Object object = new Object();
    call(bla_parameters, new listener() {
        public void onEnd() {
             synchronized(object) {
                 object.notifyAll();
             }
        }
    });
    try {
         synchronized(object) {
             object.wait();
         }
    } catch(Exception ex){}

}
于 2012-10-10T14:55:42.817 回答