2013-12-15 130 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

相关问题