Запланированное периодическое задание останавливается на втором TextView.setText () - PullRequest
0 голосов
/ 16 марта 2012

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

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 ]

2 голосов
/ 16 марта 2012

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

1 голос
/ 16 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...