2013-03-06 251 views
1

我有这个线程:Thread.sleep()方法阻塞主UI线程

private class MyThread extends Thread{ 
    public void run(){ 
     try { 
      sleep(10000); 
      Utils.stopTimer(); 
     } catch (InterruptedException e) { 
      Log.d(TAG, "interrupted"); 
     } 
    } 
} 

然后,我开始线程。但是,线程阻止了主UI线程,导致它不响应用户交互。

+1

那么你的问题是什么?它按照Thread概念工作 – 2013-03-06 06:28:46

+0

使用Thread.sleep(10000); – 2013-03-06 06:29:18

+0

@Kirit由于'this.sleep'是“静态方法Thread.sleep”的一个“别名”,因此会产生等效的语义。但是,我确实同意明确调用类型上的静态方法是更好的形式。 – 2013-03-06 06:42:50

回答

7

致电myThread.start()而不是myThread.run()

否则后者原因在不同的线程中执行的代码,但只是调用对当前(例如UI)线程run方法 - 像任何其他正常的方法调用。从链接文件


摘录:

start使该线程开始执行; Java虚拟机调用run方法[在启动线程] ...

+0

明白了,谢谢你。 – lorraine 2013-03-06 09:26:23

4

你需要调用thread.start()启动一个线程,当你调用run()方法会自动执行。

Calling this thread will also blocks the UI thread, you need to call it Async Task or in runonuithread. 
1

这将是更好地使用AsyncTaskActivity.RunOnUIThread这种类型的代码来执行。