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

Ответ 5

Немного опоздал на вечеринку, но я думаю, что ответ на эту проблему заключается во власти IntentService. IntentService является подклассом обычного класса Service. Однако есть несколько ключевых отличий.

Теперь, как вы можете использовать IntentServices в своих интересах: IntentServices не работают в главном потоке. Вместо этого они работают на отдельных "рабочих потоках". Этот единственный атрибут решит вашу проблему и уничтожит ANR, с которыми вы сталкиваетесь в настоящее время.

Чтобы узнать больше о различиях между службами и IntentServices, проверьте это.

Надеюсь, это поможет. Веселого кодирования!