Метод ожидания данных датчика - PullRequest
2 голосов
/ 19 декабря 2011

У меня есть класс, который запускает прослушиватель датчиков при запуске.Этот слушатель записывает последнее значение датчика в переменную, когда происходит событие.Класс продолжает выполнять некоторую логику, и в какой-то момент проверит эту переменную и продолжит работу в зависимости от значения.

Моя проблема в том, что нет никакой гарантии, что при чтении переменной будет какое-либо значение, так какСлушатели датчика Android запускают событие только при изменении значения датчика (и не обязательно вызывают событие, как только они запускаются).

Таким образом, мне нужно, чтобы мое приложение ожидало запуска события, чтобыу него есть данные для обработки (желательно с тайм-аутом, чтобы он не ожидал бесконечно долго).

Мой вопрос: как лучше реализовать это ожидание?Должен ли я иметь обработчик, который проверяет значение каждые X миллисекунд перед продолжением?Должен ли я иметь какую-то передачу сообщений между слушателем и обработчиком, чтобы сообщить ему, когда были записаны данные, и что теперь он может возобновиться?Есть ли другие варианты, которые лучше?

РЕДАКТИРОВАТЬ: я должен отметить, что логика класса выполняется в потоке пользовательского интерфейса.

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

Это не строго связано с Android, но и общий вопрос Java. Механизмом реализации этого является контейнер в java.lang.Oject. Предполагая, что у вас есть некоторый объект защиты, к которому имеют доступ потоки производителя и потребителя. На потребительской ветке звоните:

guard.wait(some_optional_delay_Look_into_javadoc);

Тогда поток клиента будет ждать, пока не истечет время ожидания, или ад не замерзнет, ​​или возникнет проблема с потоком производителя:

guard.notify[All]();

(читать документацию)

Ваш сервисный слушатель будет продюсером.

1 голос
/ 19 декабря 2011

Я использую 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);
            }

        });
...