2011-12-19 146 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