Обращаться к каким-нибудь элементам View не из UI потока нельзя, поэтому UI поток так и назван, что только он может обновлять вьюхи. Если попытаться обновить вьюхи не из UI потока, то вылетит CalledFromWrongThreadException.
Есть несколько способов исполнить кусок кода в UI потоке.
- Использовать метод activity.runOnUiThread(Runnable). Этот метод выполняет кусок кода, который записан в метод run() объекта Runnable. Если этот метод был вызван из UI потока, то UI поток просто сразу исполнит данный код, если же из какого-либо другого потока, то данный кусок кода будет добавлен в очередь.
- Использовать метод view.post(Runnable), view.postDelayed(Runnable, Long). View.post(Runnable) работает точно так же как и runOnUiThread(Runnable), а вот view.postDelayed(Runnable, Long) позволяет отложить исполнение кода на заданное количество миллисекунд
- Использовать handler. У класса Handler есть несколько методов, которые добавлять сообщения в очередь сообщений потока. Так что если создать handler для UI потока, используя либо context.getMainLooper() или Looper.getMainLooper() и затем добавлять сообщения в очередь, можно будет запускать код на главном потоке. У класса Handler для этого есть следующие методы:
- handler.post()
- handler.postDelayed()
- handler.postAtTime()
- handler.postAtFrontOfQueue() – но этот метод может привести к неожиданным последствиям, так что использовать его необходимо только в особенных случаях на свой страх и риск.