2011-12-19 96 views
2

我有一个启动传感器监听程序的类。当事件被触发时,这个监听器将最新的传感器值写入变量。这个类继续做一些逻辑,并且在某个时候,会检查这个变量并根据这个值继续。等待传感器数据的方法

我的问题是,当读取变量时,不能保证有任何值,因为Android传感器侦听器只在传感器值更改时触发事件(并且不一定在触发事件后立即触发事件)。因此,我需要我的应用程序等待事件触发,以便它有数据处理(最好是超时,以确保它不会无限期地等待)。

我的问题是,实现这种等待的最佳方式是什么?我应该在继续之前有一个处理程序检查每个X毫秒的值吗?我是否应该在侦听器和处理程序之间传递某种消息来告诉它何时写入数据,并且现在可以恢复?还有其他的选择更好吗?

编辑:我应该指出,类逻辑是在UI线程上执行的。

回答

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

这不是严格涉及到android,也是一般的java问题。实现这个的机制是java.lang.Oject中的容器。假设你有一些守护对象,生产者和消费者线程可以访问。在消费者线程调用:

guard.wait(some_optional_delay_Look_into_javadoc); 

然后cosumer线程将等到超时ocurs或地狱弗罗泽出或生产线的问题:

guard.notify[All](); 

(阅读文档)

您的服务监听器会制片人。

+0

你有链接到你指的文档吗? – Glitch

+0

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html –

+0

对,谢谢。是否有任何集合类实现了防护块,还是我应该手动实现? – Glitch