2013-03-06 2 views
1

У меня есть эта нить:Thread.sleep() блокирует основной поток пользовательского интерфейса

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

А потом я начал нить. Но поток блокирует основной поток пользовательского интерфейса, заставляя его не реагировать на пользовательские взаимодействия.

+1

так в чем же проблема/проблема? он работает в соответствии с концепциями Thread –

+0

Используйте Thread.sleep (10000); –

+0

@ Kirit Из-за неудачной природы 'this.sleep' является« псевдонимом »для статического метода' Thread.sleep', который будет генерировать эквивалентную семантику. Тем не менее, я согласен с тем, что явное назначение статического метода в типе - это лучшая форма. – 2013-03-06 06:42:50

ответ

7

Звоните myThread.start() и не myThread.run().

Выполнение последнего не причина код будет выполняться в другом потоке, но просто вызывает метод run на текущем (например, UI) потоке - как и любой другой нормальный вызов метода.


Выдержка из документации, связанной:

start Причины этой нити, чтобы начать выполнение; виртуальная машина языка Ява вызывает метод run [в запущенном потоке] ..

+0

Получил это, спасибо приятелю. – lorraine

4

Вам нужно позвонить Thread.start(), чтобы запустить поток и при вызове, что метод запуска() будет выполняться автоматически.

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

Было бы лучше использовать AsyncTask или Activity.RunOnUIThread для данного типа кода для выполнения.