2013-09-03 3 views
3

Я не могу понять это.Почему моя тема замораживает UI-Thread?

По какой-либо причине код этой нити фактически работает на потоке пользовательского интерфейса. Если я сломаю точку, UI остановится. или Сон, UI остановился. и, следовательно, сетевая активность не разрешена как ее на нити «ui».

Ive не используется задача Async, потому что я не знаю, как правильно ее зацикливать. (Называя новый экземпляр этого в onPostExecute кажется, плохая практика, и, как будто асинхронной для задач один прочь.

Выражаю тему.

public class SyncManager extends Thread { 

public SyncManager(Context context){ 
    sdb = new SyncManagerDBHelper(context); 
    mContext = context;  
} 

@Override 
public void run() {  

    while(State == RUNNING) { 
     try{ 
      SyncRecords(); // Break point here = UI freeze. 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     try { 
      Thread.sleep(10000); // So also causes UI freeze. 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public void startThread() { 
    Log.i("SyncManager", "start called"); 

    if((State == PAUSED || State == STOPPED) && !this.isAlive()) 
    { 
     State = RUNNING; 
     run();  
    } 
} 

и от моей деятельности я называю

sm = new SyncManager(this); 
    sm.startThread(); 
+0

Посмотрите: https://stackoverflow.com/questions/8052522/why-we-call-thread-start-method-which-in-turns-calls-run-method/36812010#36812010 –

ответ

21

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

Измените метод startThread() к следующему и должны работать:

public class SyncManager extends Thread { 

    public void startThread() { 

     if((State == PAUSED || State == STOPPED) && !this.isAlive()) { 
      State = RUNNING; 
      start(); // use start() instead of run() 
     } 
    } 
} 

Read here для получения более конкретной информации из Java повторно блога.

+1

Вздох, я знал это был глупый вопрос. По иронии судьбы я написал тестовую тему и поставил 'start();« Если бы я не спросил, я бы потратил больше времени на то, чтобы понять это. Теперь это имеет смысл. Вызов 'run()' просто вызов метода в потоке пользовательского интерфейса, как и вызов любого метода напрямую. Благодаря! – Doomsknight

+2

Вы вполне кстати, я думаю. И вопрос не глупый вообще. Вероятно, это поможет многим другим людям избежать этого небольшого заблуждения ;-) Я как-то сразу понял ответ на этот вопрос, потому что однажды я сделал это неправильно. –

+1

2 года последний и да, это помогло мне = D – user2582318

Смежные вопросы