2012-03-15 2 views
0

Я пытаюсь запланировать задачу по обновлению TextView один раз в секунду. Пока у меня есть строка, с комментарием после нее, закомментировано, все работает нормально. Logcat показывает, как коснуться:Запланированная периодическая задача зависает во второй TextView.setText()

Task 
IN 
OUT 
Task 
IN 
OUT 
... 

Но если я раскомментировать statusLabel.setText(), это то, что я вижу:

Task 
IN 
OUT 
TASK 
IN 

Эти пять строк все я получаю. По какой-то причине он, кажется, останавливается, когда он пытается снова установить текст во второй раз.


Мой код:

public class MyActivity extends Activity { 

    TextView statusLabel; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.control); 
     statusLabel = (TextView) findViewById(R.id.statusLabel); 

     ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
     scheduler.scheduleAtFixedRate(
       new Runnable() { 
        public void run() { 
         Log.d("Datalogger","Task"); 
         updateStatus(); 
        } 
       }, 0, 1, TimeUnit.SECONDS); 
    } 

    private void updateStatus() { 
     Log.d("Datalogger","IN"); 
     statusLabel.setText("X"); // !! If I comment out this line, 
     Log.d("Datalogger","OUT"); // everything works 
    } 
} 

ответ

2

Проблема в том, что вы пытаетесь обновить пользовательский интерфейс из потока, отличного от потока пользовательского интерфейса (основного). В runnable используйте runOnUiThread (Runnable action) с новым runnable для вызова updateStatus().

1

Вы не можете обновить пользовательский интерфейс от фонового потока. В вашем Журнале должна быть ошибка. Использовать Activity#runOnUiThread(Runnable)

+0

Я предполагаю, что там могла быть ошибка ... Поскольку журнал был наводнен ненужным материалом, я отфильтровал все, кроме моих собственных сообщений :) Я думаю, я должен спать уже ... – varesa

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