2016-04-03 48 views
5

我對android非常陌生。希望這不是一個愚蠢的問題。startActivty在不同的線程

protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    new Thread(new Runnable() 
    { 
     public void run() 
     { 
      Intent intent = new Intent(MainActivity.this, SecondActivity.class); 
      startActivity(intent); 
     } 
    }).start(); 
} 

問題:爲什麼這個工作? startActivity可以從輔助線程中調用是否正常?

我認爲所有UI相關的東西都必須在UI線程中完成。

+0

'.run()'在當前線程上運行代碼。你應該調用'.start()'在新線程上運行它。不回答這個問題,但至少讓你知道這不是對你的問題的真正考驗。 –

+0

@GeorgeMulligan你是對的,但它是一個錯字。我的意思是開始(),我的不好。我無法接受道格的回答,似乎需要等待9分鐘... – James

回答

3

startActivity不是立即的。它安排活動的開始在主線程的下一個可用週期運行,以便您可以從任何地方調用它。 (儘管如此,這並不一定意味着它是個好主意。)

除了主線程以外,您不應觸摸視圖層次結構。這是一個不同的問題。

1

startActivity方法可以從任何Activity Context

被稱爲線程的一個新實例有權訪問Context,這反過來又具有Activity。這就是爲什麼你的代碼工作。

需要注意的是,如果這種方法被從Activity Context以外調用,則Intent必須包括FLAG_ACTIVITY_NEW_TASK 啓動標誌。這是因爲,沒有從現有的開始,不存在將新活動 置於其中的任務,因此它需要被放置在它自己的單獨任務中。

如果找不到運行給定Intent的Activity,此方法將拋出ActivityNotFoundException

欲瞭解更多信息,請閱讀this developer manual