2

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

私の問題は、変数が読み取られたときに値があるという保証がないことです.Androidセンサーリスナーは、センサー値が変化したときにのみイベントをトリガーします(開始するとすぐにイベントをトリガーするとは限りません)。

したがって、アプリがイベントがトリガーされるのを待って、データが機能するようにする必要があります (できればタイムアウトを使用して、無期限に待機しないようにします)。

私の質問は、この待機を実装する最良の方法は何ですか? 続行する前に X ミリ秒ごとに値をチェックするハンドラーが必要ですか? リスナーとハンドラーの間で何らかのメッセージをやり取りして、データがいつ書き込まれたかを通知し、再開できるようにする必要がありますか? より良い他のオプションはありますか?

編集:指摘する必要があります、クラス ロジックは UI スレッドで実行されます。

4

2 に答える 2

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

        });
于 2011-12-19T14:44:45.853 に答える
1

これは厳密には Android に関連するものではなく、一般的な Java の質問でもあります。これを実現する仕組みがjava.lang.Ojectのコンテナです。プロデューサースレッドとコンシューマースレッドがアクセスできるガードオブジェクトがあると仮定します。コンシューマ スレッドで次のように呼び出します。

guard.wait(some_optional_delay_Look_into_javadoc);

次に、消費者スレッドは、タイムアウトが発生するか、地獄がフリーズするか、生産者スレッドの問題が発生するまで待機します。

guard.notify[All]();

(ドキュメントを読む)

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

于 2011-12-19T14:45:32.610 に答える