[英]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之后,主線程可以自由運行下一個計划的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.