Сервис или асинтаск для датчиков выборки в Android?

Мне нужно получать данные с различных датчиков, таких как акселерометр, гироскоп, микрофон и GPS. Действие обнаружения не должно быть непрерывным, а должны периодически планироваться отдельные короткие интервалы выборки в соответствии с различными политиками (например, энергосбережение). Каждое действие выборки датчика длится несколько секунд, скажем, 5 секунд. Я бы реализовал «Клиента» для каждого датчика, назначенного для прослушивания данных датчика, когда это необходимо, и «Контроллер», который контролирует выполнение клиентов, но я не уверен, как это реализовать.

Правильно ли реализовать Сервис для каждого Клиента? или будет лучше простой AsyncTask или Handler?

Лучше, если каждый клиент отвечает за одно действие обнаружения, выполняемое в одном onStartService(), или если действие onStartService() разрешает периодическое действие выборки? Помощь приветствуется.


person user1781028    schedule 28.10.2012    source источник


Ответы (3)


Это похоже на задачу для Service, которая запускается Alarm с (регулярными) запланированными интервалами.

AsyncTask обычно запускается после того, как пользователь выполнил некоторое взаимодействие, и предполагается, что система выполняет «длительную» операцию (например, сетевой ввод-вывод), которая в противном случае могла бы заблокировать пользовательский интерфейс.

Обратите внимание, что вполне возможно также запустить службу, такую ​​​​как AsyncTask - взгляните на IntentService.

person Heiko Rupp    schedule 28.10.2012
comment
таким образом, Контроллер контролирует планирование каждого отдельного действия по обнаружению, выполняемого каждой Службой, правильно устанавливая период повторения каждого Клиента? Звучит хорошо! Большое спасибо! - person user1781028; 29.10.2012
comment
Да, конечно, каждый клиент порождает свой собственный поток для вычисления действия обнаружения, поэтому я буду использовать Intent Service для некоторых клиентов или Looper/Handler для других (если события датчика отправляются в прослушивателе). Кроме того, все эти компоненты (контроллеры и клиенты) полностью отделены от элементов пользовательского интерфейса, поскольку они выполняются в отдельном процессе и даже не взаимодействуют с пользовательским интерфейсом. - person user1781028; 29.10.2012
comment
После дальнейшего чтения кажется, что Тревога задумана для более спорадической периодичности. В моем случае события запланированы с периодом от 30 секунд до 30 минут. Можно ли так часто использовать будильник? На данный момент я использую Timer из Java. - person user1781028; 29.10.2012

Я предлагаю вам взглянуть на мой ответ на аналогичный вопрос здесь: Service v/s AsyncTask< /а>.

Лично я бы использовал простой Handler, чтобы опубликовать задачу для запуска с определенным интервалом времени.

Пример:

private Handler mHandler = new Handler();

private void startTimer(Runnable Task, long delay) {  
    mHandler.removeCallbacks(Task);       
    mHandler.postDelayed(Task, delay);    
}

private void stopTimer(Runnable Task) {  
    mHandler.removeCallbacks(Task);       
}

private Runnable registerListeners = new Runnable() {
    public void run() {
        startTimer(registerListeners, 10*60*1000); //register to run again in 10 minutes
        startTimer(unregisterListeners, 5*1000); //to unregister in 5 seconds 
        //here register your listeners
    }
};

private Runnable unregisterListeners = new Runnable() {
    public void run() {
        //here unregister your listeners
    }
};

Когда вы хотите начать процесс прослушивания:

//To start you listeners
startTimer(registerListeners, 0);

Когда вы хотите остановить все:

//To stop registering/unregistering listeners
stopTimer(registerListeners);

Примечание. Если вы выполняете длинный код в своих слушателях, вам следует взглянуть на ответ по ссылке, которую я дал выше.

С уважением.

person Luis    schedule 28.10.2012

Лучшие практики с сайта разработчиков Android

Рекомендации по доступу к датчикам и их использованию

Рекомендации по фоновым заданиям

person Sree Rama    schedule 23.12.2013
comment
Хотя эти ссылки могут дать ответ на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. . Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - person bummi; 23.12.2013