2
TextView.setText(""+555);  
try{TimeUnit.SECONDS.sleep(10);} catch (InterruptedException e){e.printStackTrace();}; 
TextView.setText(""+666);

Вот такой код. Должен сначала поставить на текстовое поле 555. Подождать 10 секунд. Потом изменить поле на 666. Но, в деле не так. Когда запускаю прогу, то она ждет 10 секунд и сразу ставит 666. А 555 я даже не вижу на экране.

Подозреваю что эту задачу можно решит только с отдельным потоком (Например через AsyncTask). Так ли это? Если это так, то просьба написать код. А то я пробую через AsyncTask, все равно 555 не вижу.

Или же есть более простое решение такой задачи?

ragmon
  • 989
  • 3
  • 13
  • 27

2 Answers2

3

Можно использовать класс Handler, который является дальнейшим развитием потоков в Android и упрощает код:

textView.setText("" + 555);
new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            textView.setText("" + 666);
        }
}, 10000);

С лямбдами выглядит еще лучше:

textView.setText("" + 555);
new Handler().postDelayed(() -> textView.setText("" + 666), 10000);
mit
  • 2,306
  • 13
  • 20
  • А можно ли вот так запустить еще и процедуру textView.setText("" + 555); new Handler().postDelayed(() -> textView.setText("" + 666), 10000); new Handler().postDelayed(() -> zapuskprocedury(), 10000); – androman Mar 13 '17 at 18:35
  • @androman да, можно. – mit Mar 13 '17 at 18:37
  • Думаю, в коде ошибка со скобками. – androman Mar 13 '17 at 18:41
  • @androman думаю, что вы пытаетесь использовать второй вариант кода с лямбдами без подключения библиотеки. Все ссылки есть в ответе. – mit Mar 13 '17 at 18:42
  • У меня пишет ошибку - Lambda expression are not supported at this language level – androman Mar 13 '17 at 18:47
  • @androman все правильно, чтобы использовать лямбды в андроид, нужно подключить библиотеку, ссылку на которую я дал перед кодом второго варианта, или используйте стандартный код из первого варианта (без лямбд). – mit Mar 13 '17 at 18:50
  • Супер! Все работает! Спасибо большое! – androman Mar 13 '17 at 18:56
  • Как мне поднять тебе репутацию в знак благодарности? – androman Mar 13 '17 at 18:57
  • @androman пометить ответ, как принятый (рядом с ответом есть галочка) – mit Mar 13 '17 at 19:00
2

View обновляются. Но они обновляются после того, как программа заснёт на 10 секунд. Так что это нужно делать, действительно, в другом потоке.

AsyncTask в данном случае - слишком тяжёлая артиллерия! Можно создать анонимный класс, в котором будет выполняться в новом потоке.

Как-то так:

textView.setText("" + 555);
Thread myThready = new Thread(new Runnable() {
        public void run() {
            try {
                Thread.sleep(10000);
            } 
            catch (InterruptedException e) {
                e.printStackTrace();
            }
            textView.setText("" + 666);
        }
    });
myThready.start();

P.S. Не называйте переменные с заглавной буквы.

Использование метода sleep()