2013-12-15 169 views
4

我就是那個觀點只能從主線程被操縱的印象......但是,爲什麼這不會崩潰:Android爲什麼這不會拋出錯誤的線程異常?

public class MainActivity extends Activity { 
    TextView tv; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     tv = new TextView(this); 
     tv.setText("original text"); 
     setContentView(tv); 

     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       tv.setText("trollollolol i should die here but i won't."); 
      } 
     }).start();   
    } 
} 

我跑設備&模擬器,都工作得很好,我看到了文本更改。這是怎麼回事?

我還檢查線程ID和後臺線程絕對不是主線程(線程ID = 1)

+0

雖然我不太熟悉Android UI的線程實現和檢查,但我不禁想知道在調用Activity.onCreate期間是否有「運行UI線程」這樣的事情?畢竟,在這個線程中添加一個簡短的Thread.sleep會導致應用程序崩潰。 – harism

+0

我不熟悉檢查的具體實現(我已經看到一些CalledFromWrongThreadException發生之前)。但通過在UI線程上運行,我認爲Android可能已經檢查了一些調用,以檢查您當前的線程ID是否不是1。線程ID 1一直是我所理解的「主/ UI線程」 –

+0

這相當有趣我相信:在更新文本視圖之前,在線程內添加一個'Thread.sleep(1000);'。該應用程序將崩潰,並引發預期的'CalledFromWrongThreadException'。 –

回答

1

的Android實際上並沒有從主線程以外更新UI阻止你。這只是一個滴答作響的定時炸彈。如果主UI線程沒有在當時更新UI,那麼你的線程可以做到這一點。 至少這是我的理解。我不是100%知道的,但我已經能夠(意外地)從主UI線程之外更新UI。有時它會起作用,有時它不會。但作爲一個良好的做法,我會使用Async task

+0

供參考:你不需要'異步任務'你可以在另一個線程中使用'runOnUiThread(Runnable)'。但有時'Async'確實對於真實背景工作更有用。 – Peterdk

+0

我知道。異步任務只是首選方式。 – user2511882

相關問題