Android "Сервис" не очень в фоновом режиме? - PullRequest
2 голосов
/ 15 февраля 2012

Я пытаюсь поиграть с Android-сервисом, но чем больше я играю с ним, тем больше я вижу, что он тесно связан с потоком пользовательского интерфейса.Я имею в виду, что я запускаю Activity и вызываю Service, просто потому что yucks делает очень длинный цикл for в Service.Я ожидал бы, что цикл for будет происходить в «фоновом режиме» и не будет мешать моему пользовательскому интерфейсу, но он замораживает мой пользовательский интерфейс во время цикла for (и он возвращает мой пользовательский интерфейс в нормальное состояние после завершения цикла for).Почему «Сервис» просто не работает в «фоновом режиме», а не портит мой пользовательский интерфейс?Как я могу заставить его работать в фоновом режиме?

Ответы [ 3 ]

3 голосов
/ 15 февраля 2012

из руководства :

Что такое служба?

Наибольшее заблуждение относительно класса Service на самом деле связано с тем, чем оно не является:

  1. Служба не отдельный процесс.Сам объект Service не подразумевает, что он работает в своем собственном процессе;если не указано иное, он выполняется в том же процессе, что и приложение, частью которого он является.
  2. Служба - , а не - поток.Это не средство само по себе работать с основным потоком (чтобы избежать ошибок приложения, не отвечающего).

Это то, что вы должны делать (опять же, взято из руководства, а такжеупомянутый @Jave):

Обратите внимание, что сервисы, как и другие объекты приложений, работают в основном потоке своего процесса хостинга.Это означает, что, если ваша служба будет выполнять какие-либо операции с интенсивным использованием ЦП (например, воспроизведение MP3) или блокировать (например, сетевые), она должна создать свой собственный поток, в котором будет выполняться эта работа.Более подробную информацию об этом можно найти в Процессы и потоки .Класс IntentService доступен как стандартная реализация Service, которая имеет собственный поток, в котором она планирует свою работу.

0 голосов
/ 15 февраля 2012
class DownloadingService extends Service
{
...
    @Override
    public void onCreate()
    {
        ...
        // Start up the thread running the service. Note that we create a
        // separate thread because the service normally runs in the process's
        // main thread, which we don't want to block.
        Thread notifyingThread = new Thread(null, mTask, "DownloadingService");
        notifyingThread.start();
    }

    private Runnable mTask = new Runnable()
    {
        public void run()
        {
            // here the job is going to be done
        }
    };
}
0 голосов
/ 15 февраля 2012

Из документации для Service:

Обратите внимание, что службы, как и другие объекты приложений, работают в основном поток их хостинга. Это означает, что если ваш сервис собирается сделать любой процессор интенсивным (например, воспроизведение MP3) или блокировку (например, как сетевые операции, он должен создать свой собственный поток, в котором сделай эту работу. Более подробную информацию об этом можно найти в Процессы и Темы . Класс IntentService доступен в стандартной комплектации реализация службы, которая имеет свой собственный поток, где он планирует его работа еще предстоит сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...