2011-12-19 12 views
2

センサーリスナーを起動するときにセンサーリスナーを開始するクラスがあります。このリスナーは、イベントがトリガーされたときに最新のセンサー値を変数に書き込みます。クラスはいくつかのロジックを実行し、ある時点でこの変数をチェックし、値に応じて処理を進めます。センサーデータを待つ方法

私の問題は、Androidセンサーリスナーはセンサ値が変更されたときだけイベントをトリガするため(変数が読み込まれると必ず値が存在するという保証はありません) )。

このように、私のアプリは、イベントをトリガするのを待つようにアプリケーションを必要とします(タイムアウトで、無期限に待たないようにすることをお勧めします)。

私の質問は、この待機を実装する最良の方法は何ですか?先に進む前にすべてのXミリ秒の値をチェックするハンドラを用意する必要がありますか?リスナーとハンドラの間に何らかのメッセージを渡して、データが書き込まれたときにそれを伝える必要がありますか?他にも良い選択肢がありますか?

EDIT:クラスロジックはUIスレッド上で実行されます。

答えて

1

まったく同じ状況でハンドラを使用しています。

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

これは厳密にアンドロイドに関連するものではなく、一般的なJavaの質問です。これを実装するメカニズムはjava.lang.Ojectのコンテナです。プロデューサスレッドとコンシューマスレッドがアクセスできるガードオブジェクトがあると仮定します。消費者のスレッドでは、あなたが呼び出す:

guard.wait(some_optional_delay_Look_into_javadoc); 

を次にcosumerスレッドがタイムアウトocursや地獄のfrozesアウトや生産者スレッドの問題まで待機します:

guard.notify[All](); 

(ドキュメントを読む)

あなたのサービスリスナーがなりますプロデューサー。

+0

あなたが参照しているドキュメントへのリンクがありますか? – Glitch

+0

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

+0

ありがとうございます。保護されたブロックを実装するコレクションクラスがありますか?それとも手動で実装する必要がありますか? – Glitch

関連する問題