Android プログラムで UI 操作を行う場合は、その処理はアプリのメインスレッドから行わなければいけません(Android に限らずほとんどの OS で同じような感じです)。
Activity
の onCreate
メソッドなどを呼び出しているのがそのアプリのメインスレッドであり、Android ではイコール UI スレッドです。
タイマー処理などで、UI を更新する場合はこのメインスレッドから行う必要があり、新しく立ち上げた別のスレッドから UI を更新することはできません。
このようなケースで利用できるのが android.os.Handler
クラスです。
Handler#post
メソッドに Runnable
オブジェクトを渡すと、最終的にその Handler
オブジェクトを生成したスレッドで Runnable
オブジェクトの run
メソッドが実行されるようになっています。
つまり、Handler
オブジェクトを Application
のメインスレッドから(例えば Activity
のフィールドとして)生成しておけば、そこに post
した Runnable
タスクは、メインスレッドで実行されることが保証されます。
Handler#post
メソッドは、内部的にはスレッドローカルな Looper
に結び付けられた MessageQueue
オブジェクトに処理をキューイングしています。
Handler
オブジェクトをメインスレッドから生成すれば、メインスレッド上の MessageQueue
と結び付けられ、その MessageQueue
が Looper
によってメインスレッド上で処理されるという流れになっています。
別の言い方をすれば、メインスレッドの MessageQueue
に対して、Runnable
タスクを投入するためのインタフェースとなるのが Handler
オブジェクトというわけです。