Я заметил, что основной цикл вызывается во время анимации, пропуская некоторые анимации, если поток пользовательского интерфейса делает что-то трудоемкое. Один из способов решения этой проблемы - запустить поток, либо исполняемый, либо вызываемый, а затем они присоединяются к потоку пользовательского интерфейса (автоматически для вызываемого и вручную, вызывая запуск в потоке пользовательского интерфейса).
Но означает ли это, что поток пользовательского интерфейса может быть прерван другими потоками во время чего-то важного? То есть, если другой поток возвращает некоторые данные, но пользовательский интерфейс что-то делает со старыми данными.
Краткий ответ: Основной поток завершит то, что он делает, и не будет прерван, другой поток опубликует исполняемый файл с новыми данными в основном потоке и продолжит выполнение других действий (если они есть), в конечном итоге основной поток запустит исполняемый файл. содержащий новые данные из другого потока.
Дубликат stackoverflow.com/q/7597742/6208842
runOnUiThread()
работает следующим образом
Runs the specified action on the UI thread. If the current thread is the UI thread, then the action is executed immediately. If the current thread is not the UI thread, the action is posted to the event queue of the UI thread.
Итак, чтобы понять это, используя опубликованный вами сценарий, он будет работать примерно так: основной поток выполнит текущее событие, с которым он работает, и добавит ваше событие в очередь событий потока пользовательского интерфейса.
Попробуй это:-
runOnUiThread (new Thread(new Runnable() {
public void run() {
while(i++ < 1000){
btn.setText("#"+i);
try {
Thread.sleep(300);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}));
Возможный дубликат Как правильно прервать поток в Android