Android - Как запустить Сервис в другой теме, чем основной поток?
Я пытаюсь разработать приложение в android, которое состоит из службы для считывания значения датчика в течение нескольких часов. Когда я запускаю сервис, мое устройство зависает, и все остальные процессы становятся медленными. Чтобы решить эту проблему, я попытаюсь запустить сервис в отдельном потоке, как указано ниже, но проблема все еще существует.
new Thread(new Runnable() {
@Override
public void run() {
Intent intent=new Intent(getApplicationContext(), SensorService.class);
startService(intent);
}
}).start();
этот поток запускает службу только в другом потоке, но запускается в основном потоке.
Plz кто-то помогает мне запускать службу в отдельном потоке?
Ответы
Ответ 1
Компоненты приложения (службы, действия и т.д.) всегда запускаются в основном потоке, независимо от того, с какого потока они запускаются.
Рассмотрите возможность запуска потока в своей службе или используйте IntentService
.
В вашем конкретном случае вы можете попытаться зарегистрировать глобальный BroadcastReceiver
для изменений датчика, который, в свою очередь, запустит IntentService
, чтобы поместить вновь полученные значения в db и т.д.
Собственно, вот ссылка на аналогичный вопрос.
Опять же, это не проблема многопоточности. Вся задача должна быть реализована другим способом.
Ответ 2
Все, что вы делаете, запускает новое действие, поэтому, если ваша логика для запуска монитора находится в SensorService
, тогда он все равно будет в основном потоке. Вам нужно включить логику мониторинга в новый поток, а не просто запускать с ней работу.
Если вы пытаетесь запустить службу в фоновом потоке, вам нужно использовать статический метод performOnBackgrounThread
, такой как этот код, который можно найти в документации на Android (Android-8\SampleSyncAdapter\src\com\example\android\samplesync\клиент\NetworkUtilities.java):
public static Thread performOnBackgroundThread(final Runnable runnable) {
final Thread t = new Thread() {
@Override
public void run() {
try {
runnable.run();
} finally {
}
}
};
t.start();
return t;
}
Также важно помнить, что вы никогда не хотите выполнять сетевые операции в потоке основного интерфейса. Не то, чтобы вы здесь, просто FYI...
Ответ 3
Вы можете использовать Фоновые службы для решения этой проблемы. Используя Thread
с sleep()
для конкретного экземпляра, вы получите решение своей проблемы
Фоновые сервисы
Эта ссылка поможет вам.
Или использование PendingIntent
поможет вам, например...
PendingIntent operation = PendingIntent.getActivity(getBaseContext(), 0, ij, Intent.FLAG_ACTIVITY_NEW_TASK);
Ответ 4
вы можете попробовать использовать AsyncTask
, пожалуйста, прочитайте эту документацию.
http://developer.android.com/reference/android/os/AsyncTask.html
Ответ 5
Немного опоздал на вечеринку, но я думаю, что ответ на эту проблему заключается во власти IntentService
. IntentService является подклассом обычного класса Service. Однако есть несколько ключевых отличий.
Теперь, как вы можете использовать IntentServices в своих интересах: IntentServices не работают в главном потоке. Вместо этого они работают на отдельных "рабочих потоках". Этот единственный атрибут решит вашу проблему и уничтожит ANR, с которыми вы сталкиваетесь в настоящее время.
Чтобы узнать больше о различиях между службами и IntentServices, проверьте это.
Надеюсь, это поможет. Веселого кодирования!