All user interface updates are performed from one thread. This is the main thread. All events are collected in a queue and processed by the Looper class instance.
The following image explains the relationship between classes involved:
It is important to note that the main thread updates are all the UI you see. However, it can be done from other threads as well. Doing this directly from some other thread will cause an exception and your application can crash. To avoid this, execute all thread-related code on the main thread by calling the runOnUiThread() method from your current activity context.