gpt4 book ai didi

android - 如何以同步方式与监听器一起工作?

转载 作者:太空狗 更新时间:2023-10-29 13:33:48 25 4
gpt4 key购买 nike

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

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

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

之前(伪代码)

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

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

所以可能有其他东西锁定了代码。

最佳答案

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

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

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){}

}

关于android - 如何以同步方式与监听器一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12822216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com