Активно запросить датчик приближения один раз?
Мне нужно получить текущее значение датчика приближения (а не реализовать непрерывный слушатель). На некоторых устройствах первое сообщаемое значение будет значением по умолчанию (например, "FAR"), которое не обязательно является точным, а фактические значения начнут появляться только после второго или третьего чтения. На данный момент я реализовал 1 секунду Handler
и использовать последнее сообщенное значение (после истечения второго) в качестве "истинного" значения, но это решение кажется грубым (и медленным). Есть ли лучший подход, который работает на всех устройствах 4.0+? Я мог бы просто посчитать, пока не получу 3 показания, но на некоторых устройствах (например, GNex) первое значение будет правильным, и значение изменится только после этого, если действительно будет изменение в датчике.
1 ответ
Вы можете сделать то, что я сделал:
У вас наверное есть if
оператор на слушателя - один логический поток для ближнего и один для дальнего.
Вместо ожидания на обработчике - сделайте это:
if(near) {
myHandler.removeCallbacks(yourRunnableForFar);
myHandler.postDelayed(yourRunnableForNear,100);
else {
myHandler.removeCallbacks(yourRunnableForNear);
myHandler.postDelayed(yourRunnableForFar,100);
}
Обратите внимание, что за неточным первым чтением (-ями) сразу же последует точное, поэтому последнее "выигрывает".
Этот код работает хорошо, если вы не регистрировали датчики, кроме приближения. Если у вас есть поток показаний от других датчиков, чем использовать статический флаг (такой как boolean near
) запускать вызовы обработчика только при изменении состояния.
Разработка:yourRunnableForFar
а также yourRunnableForNear
- заполнители, которые implement Runnable
держать логику вашего приложения на том, что делать, когда датчик приближения возвращает "ближний" (event.values[0] == 0
) или "далеко" (не 0).
myHandler
это просто любой обработчик, который вы могли бы создать, или объявить один только для этого с Handler myHandler = new Handler(Looper.getMainLooper());
Возможно, вы захотите приобрести бесконтактный замок рядом, отпустить его и очистить слушателя далеко. Но это логика приложения, которая может полностью отличаться от приложения к приложению.