我有一个类,它在启动时启动传感器监听器。当触发事件时,此侦听器将最新的传感器值写入变量。该类继续做一些逻辑,在某些时候,将检查此变量并继续,具体取决于值。
我的问题是,在读取变量时无法保证存在任何值,因为Android传感器侦听器仅在传感器值更改时触发事件(并且一旦启动就不一定触发事件)
因此,我需要我的应用程序等待一个事件触发,以便它有数据可以解决(最好是超时,以确保它不会无限期地等待)。
我的问题是,实施此等待的最佳方式是什么?我应该有一个处理程序,在继续之前检查每个X毫秒的值吗?我是否应该在侦听器和处理程序之间传递某种消息,以便在数据写入时告诉它,并且它现在可以恢复?还有其他更好的选择吗?
编辑:我应该指出,类逻辑是在UI线程上执行的。
答案 0 :(得分:1)
我正在使用Handler完全相同的情况。
Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
x1.setText(String.valueOf(sensors.getValueAccX()));
Log.d("Sensors", String.valueOf(sensors.getValueAccZ()));//using persoanl methods that are not shown here
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
Toast.makeText(ClientSideActivity.this,
"Server is not running", Toast.LENGTH_LONG).show();
// TODO Auto-generated catch block
e.printStackTrace();
}
// TODO Auto-generated method stub
handler.postDelayed(this, 100);
}
});
答案 1 :(得分:1)
这与android没有严格的关系,也是一般的java问题。实现它的机制是java.lang.Oject中的容器。假设您有一些保护对象,生产者和消费者线程可以访问。在消费者主题上,您可以致电:
guard.wait(some_optional_delay_Look_into_javadoc);
然后,cosumer线程将等到超时发生或地狱冻结或生产者线程问题:
guard.notify[All]();
(阅读文件)
您的服务监听器将是制作人。