Почему Android Service и Activity выполняются асинхронно в главном потоке - PullRequest
0 голосов
/ 25 января 2019

Это может быть очень простой вопрос, и часто мне задавали этот вопрос в интервью и все такое, но я не могу найти правильный четкий ответ для этого, поэтому спрашиваю здесь

У меня есть простой сервис следующим образом

    public class MyService extends Service {
        private static final String TAG = "MyService";

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            for (int i = 0; i < 10; i++) {
                Log.d(TAG, "onStartCommand: " + i + " in " + Thread.currentThread().getName());
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return START_NOT_STICKY;
        }           
    }

Служба печатает с 1 по 10 с небольшой задержкой.

И у меня есть этот код в Activate onCreate

          @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                startService(new Intent(this, MyService.class));   // starting the service    
                try {
                    Thread.sleep(5000);  // waiting for 5 seconds after service started
                } catch (InterruptedException e) {  
                    e.printStackTrace();
                }
                Log.d(TAG, "onCreate completed");
            }

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

Таким образом, в идеале он должен сначала выполнить служебный код и, наконец, вывести "onCreate completed", который является последней строкой в ​​onCreate, поскольку у нас есть только один поток, чтобы выполнить все эти

Но во время бега я вижу, что:

  // here is a delay of 5 seconds and after that the following prints
  onCreate: completed
  onStartCommand: 0 in main
  onStartCommand: 1 in main
  onStartCommand: 2 in main
  onStartCommand: 3 in main
  onStartCommand: 4 in main
  onStartCommand: 5 in main
  onStartCommand: 6 in main
  onStartCommand: 7 in main
  onStartCommand: 8 in main
  onStartCommand: 9 in main

Как видите, даже если я сначала запускаю службу, а потом ставлю задержку, onCreate finishes сначала выполнение.

Тогда только служба запускает выполнение в главном потоке. Почему это так?

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

Это правильно?

Если бы кто-нибудь мог дать подробное объяснение того, что происходит за кулисами, это было бы очень полезно. Заранее спасибо!

1 Ответ

0 голосов
/ 26 января 2019

В двух словах: в onCreate() вызов startService() - это просто запрос на запуск Service. Поскольку Service будет выполняться в главном потоке, все его методы могут быть выполнены только после завершения onCreate().

При Thread.sleep(5000); основной поток блокируется onCreate() на пять секунд. После того, как вы запишете в Logcat последний шаг в этом методе, основной поток сможет запустить следующий запланированный метод.

Полезная ссылка: Понимание Android Core: Looper, Handler и HandlerThread

...