AndroidでHandler(ハンドラー)を使う方法をわかりやすく解説
Androidアプリ開発では、バックグラウンド処理の結果をUIスレッドに反映させたい場面がよくあります。そんなときに活躍するのがHandlerクラスです。この記事では、TimerとHandlerを組み合わせて、ボタンを画面上のランダムな位置に移動させるサンプルを通じて、Handlerの基本的な使い方を解説します。
Handlerとは?
Handlerは、別スレッドからUIスレッドへ処理を投稿(post)するための仕組みです。AndroidではUIの操作はメインスレッド(UIスレッド)からしか行えないため、TimerTaskなどのバックグラウンドスレッド内で直接Viewを操作するとエラーになります。そこでHandlerのpost()メソッドを使うことで、安全にUIを更新できます。
手順1:新規プロジェクトを作成する
Android Studioを開き、「File」→「New Project」を選択して、必要な情報を入力し新しいプロジェクトを作成します。
手順2:レイアウトファイルを編集する
res/layout/activity_main.xml に以下のコードを追加します。
<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "https://schemas.android.com/apk/res/android"
android:orientation = "vertical"
android:layout_width = "match_parent"
android:layout_height = "match_parent">
<Button
android:id = "@+id/my_button"
android:layout_width = "100dp"
android:layout_height = "wrap_content"
android:layout_x = "0dp"
android:layout_y = "0dp"
android:text = "Yes" />
</LinearLayout>このコードでは、画面に表示するためのボタンを1つ配置しています。
手順3:MainActivity.javaを実装する
src/MainActivity.java に以下のコードを記述します。
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.FragmentActivity;
import android.util.DisplayMetrics;
import android.widget.Button;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends FragmentActivity {
Handler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new Handler();
final Button button = (Button) findViewById(R.id.my_button);
final DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
Random R = new Random();
final float dx = R.nextFloat() * displaymetrics.widthPixels;
final float dy = R.nextFloat() * displaymetrics.heightPixels;
button.animate()
.x(dx)
.y(dy)
.setDuration(0)
.start();
}
});
}
}, 0, 1000);
}
}コードのポイント
- Handlerの生成:
handler = new Handler()でメインスレッドに紐づいたHandlerを作成します。 - Timerによる定期実行:
timer.schedule()を使うことで、1秒ごと(1000ミリ秒間隔)に処理が繰り返し実行されます。 - handler.post()でUI更新: TimerTaskはバックグラウンドスレッドで動くため、そのままではViewを操作できません。
handler.post()内に処理を記述することで、UIスレッド上でボタンの位置を変更しています。 - ランダムな位置への移動:
Randomクラスで生成した乱数をもとに、画面の幅・高さの範囲内でボタンのX座標・Y座標を決定し、animate()メソッドで移動させています。
アプリを実行してみよう
それでは実際にアプリを起動してみましょう。Android端末をパソコンに接続した状態で、Android Studioからプロジェクトのアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックします。実行デバイスとして自分のスマートフォンを選択すると、端末の画面に以下のようにボタンが1秒ごとにランダムな位置へ移動していく様子が確認できます。

まとめ
このように、Handlerを使えばバックグラウンドスレッドからの処理でも安全にUIを更新できます。TimerやThreadと組み合わせるケースは実務でも頻繁に登場するので、ぜひ基本パターンとして覚えておきましょう。なお、近年ではHandler(Looper.getMainLooper())の明示的な指定や、CoroutineやWorkManagerなどよりモダンな非同期処理手法も推奨されているため、用途に応じて使い分けるのがおすすめです。
-
【Android】スナックバー(Snackbar)の使い方をステップごとに解説
このチュートリアルでは、Androidアプリでスナックバー(Snackbar)を使用する方法を、サンプルコードとともに段階的に解説します。スナックバーは画面下部に短いメッセージを一時的に表示できるUIコンポーネントで、Toastとは異なり「再試行(RETRY)」などのアクションボタンを組み込めるのが大きな特徴です。 手順1:新規プロジェクトを作成する Android Studioを起動し、メニューから「File」→「New Project」を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成しましょう。 手順2:レイアウトファイル(activity_main.xml)を編集する
-
【Android】NavigationViewの実装方法をステップごとに解説
この記事では、AndroidアプリでNavigationView(ナビゲーションビュー)を使用してドロワーメニューを実装する方法を、ステップごとに詳しく解説します。ハンバーガーアイコンから開閉できるサイドメニューは、多くのアプリで採用されている定番のUIです。ステップ1:新しいプロジェクトを作成するAndroid Studioを開き、File → New Project を選択して、必要な情報を入力し新しいプロジェクトを作成します。テンプレートには「Navigation Drawer Activity」を選ぶと、後の作業がスムーズになります。ステップ2:activity_main.xml にコ