2013-07-31 3 views
2

У меня очень простое действие, которое печатает пользовательскую строку времени даты в textView. Я реализовал runnable-интерфейс в MainActivity it self и создал Thread в конце метода onCreate.Реализация Runnable в MainActivity

Thread thread = new Thread(this); 
thread.run(); 

Это метод запуска

public void run() { 

     while (true) { 
      try { 
       Thread.sleep(1000); 
       localTime.setText(LocalTime.getTime().format2445()); 
       System.out.println(LocalTime.getTime().format2445()); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 

    } 

Когда я запустить его на эмуляторе я могу увидеть систему в LogCat. Но эмулятор показывает ANR примерно через 5 секунд. Что я делаю не так. Этот метод не подходит? это Async Task - это путь сюда? Мне нужно обновлять часы каждую секунду, так что выполнение AsyncTask навсегда - приемлемый шаблон?

+2

вам нужно позвонить. 'Thread.start()'. – Raghunandan

+0

что вы пытаетесь сделать? Внедрить 'CountDownTimer'? – gunar

+0

также, 'localTime' является' TextView'? – gunar

ответ

2

Вы должны начать thread.start()

http://developer.android.com/reference/java/lang/Thread.html

Цитируя Документов

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

Вы звоните thread.run(). Вы также называете сон. Вы не должны блокировать поток ui.

http://developer.android.com/training/articles/perf-anr.html

Если вы ищете таймер обратного отсчета

http://developer.android.com/reference/android/os/CountDownTimer.html

Countdowntimer in minutes and seconds.

Вы также можете использовать задачу Обработчик, таймер. Если вы используете задачу таймера, убедитесь, что вы удалили ui в поток ui.

Android Thread for a timer

Edit: я не заметил этого. поэтому из приведенных выше замечаний. Кредиты DoctorDrive

localTime.setText(LocalTime.getTime().format2445()); // update ui from thread is not possible 

Вы должны использовать runOnUiThread

runOnUiThread(new Runnable() //run on ui thread 
      { 
       public void run() 
       { 
       localTime.setText(LocalTime.getTime().format2445()); 

       } 
      }); 
+0

Спасибо Raghunandan, :-) Я не могу принять ваш ответ, но я должен ждать 7 минут. Еще раз спасибо apciciated – DevZer0

+0

@ DevZer0 не проблема его правила форума. вам нужно подождать несколько минут. – Raghunandan

2

Попробуйте что-нибудь подобное.

new Thread(new Runnable() { 
public void run() { 
    Thread.sleep(1000); 
    localTime.setText(LocalTime.getTime().format2445()); 
    System.out.println(LocalTime.getTime().format2445()); 
} 
}).start(); 
2

вероятно, вы должны использовать Thread.start() вместо thread.run()

Thread.start создает новый поток и запускает свой код в новом потоке.

thread.run запускает свой код в родительском потоке, не создает новый поток

3

Мне нужно обновить часы каждый второй так оказывают AsyncTask пробег навсегда является приемлемой модель?

Нет, это не рекомендуется. Согласно AsyncTask Documentation, они должны работать только в течение коротких промежутков времени. Я бы рекомендовал вам использовать Timer и TimerTask.

Timer timer; 

public void onStart() { 

    timer = new Timer(); 

    //this will update each second 
    timer.scheduleAtFixedRate(new UpdateTask(), 0,1000); 
} 

class UpdateTask extends TimerTask { 
    public void run() { 
     //update TextView 
    } 
} 

public void onStop(){ 

    timer.cancel(); 
} 
1

Это потому, что вы вызываете сон в потоке пользовательского интерфейса. Никогда не вызывайте сон в потоке пользовательского интерфейса. Вы можете запускать материал в потоке пользовательского интерфейса с помощью Handler.

private static final Handler handler = new Handler(); 

@Override 
protected void onCreate(Bundle state) { 
    super.onCreate(state); 
    handler.postDelayed(textRunnable, 1000); 
} 

private final Runnable textRunnable = new Runnable() { 
    @Override 
    public void run() { 
     localTime.setText(LocalTime.getTime().format2445()); 
     System.out.println(LocalTime.getTime().format2445()); 
    } 
} 

Или вы можете сделать это работает, но плохой способ

@Override 
protected void onCreate(Bundle state) { 
    super.onCreate(state); 
    new Thread() { 
     @Override 
     public void run() { 
      try { 
       Thread.sleep(1000); 
       System.out.println(LocalTime.getTime().format2445()); 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         localTime.setText(LocalTime.getTime().format2445()); 
        } 
       }); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    }.start(); 
} 
Смежные вопросы