簡體   English   中英

為什么Android Service和Activity在主線程中異步執行

[英]Why Android Service and Activity executing asynchronously in the main Thread

這可能是一個非常基本的問題,通常在面試中都會被問到這個問題,但我無法為此找到合適的明確答案,這就是為什么在這里問

我有一個簡單的服務,如下

    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。

我在活動中創建了此代碼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也會首先onCreate finishes執行。

然后只有服務在主線程中開始執行。 這是為什么?

我的理解是,Android OS將創建並准備服務組件以在不同的線程中執行,當准備就緒時,我們將在主線程的服務中獲取onCreate回調。 到那時,操作系統將異步進行准備。

那是對的嗎?

如果有人可以詳細說明幕后發生的事情,那將非常有幫助。 提前致謝!

簡而言之:在onCreate() ,調用startService()只是啟動Service的請求。 由於Service將在主線程上運行,因此只能在onCreate()完成后執行其所有方法。

使用Thread.sleep(5000); 主線程被onCreate()阻塞了五秒鍾。 作為該方法的最后一步寫入Logcat之后,主線程可以自由運行下一個計划的方法。

有用的鏈接: 了解Android Core:Looper,Handler和HandlerThread

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM