サーチ…


備考

ハンドラは、遅延された時間の後にコードを実行するために簡単に使用できます。また、Runnableのrun()メソッドからHandler.postDelayed()メソッドを再度呼び出すことによって、指定された時間後にコードを繰り返し実行する場合にも便利です。

遅延した時間の後にハンドラを使用してコードを実行する

1.5秒後にコードを実行する:

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        //The code you want to run after the time is up
    }
}, 1500); //the time you want to delay in milliseconds

コードを1秒ごとに繰り返し実行する:

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        handler.postDelayed(this, 1000);
    }
}, 1000); //the time you want to delay in milliseconds

HandlerThreadsとスレッド間の通信

Handlerは、 MessageRunnableをスレッドのメッセージキューに送信するため、複数のスレッド間でイベントベースの通信を実装するのは簡単です。 Looperを持つすべてのスレッドは、メッセージを受信して​​処理できます。 HandlerThreadは、そのようなLooperを実装するスレッドです。たとえば、メインスレッド(UIスレッド)はHandlerThread機能を実装します。

現在のスレッドのハンドラの作成

Handler handler = new Handler();

メインスレッド用のハンドラの作成(UIスレッド)

Handler handler = new Handler(Looper.getMainLooper());

別のスレッドからメインスレッドにRunnableを送信する

new Thread(new Runnable() {
    public void run() {
        // this is executed on another Thread

        // create a Handler associated with the main Thread
        Handler handler = new Handler(Looper.getMainLooper());

        // post a Runnable to the main Thread
        handler.post(new Runnable() {
            public void run() {
                // this is executed on the main Thread
            }
        });
    }
}).start();

別のHandlerThreadのハンドラを作成し、それにイベントを送信する

// create another Thread
HandlerThread otherThread = new HandlerThread("name");

// create a Handler associated with the other Thread
Handler handler = new Handler(otherThread.getLooper());

// post an event to the other Thread
handler.post(new Runnable() {
    public void run() {
        // this is executed on the other Thread
    }
});

ハンドラを実行から停止する

ハンドラの実行を停止するには、内部で実行されている実行可能ファイルを使用して、ハンドラに関連付けられたコールバックを削除します。

Runnable my_runnable = new Runnable() {
    @Override
    public void run() {
        // your code here
    }
};

public Handler handler = new Handler(); // use 'new Handler(Looper.getMainLooper());' if you want this handler to control something in the UI
// to start the handler
public void start() {
    handler.postDelayed(my_runnable, 10000);
}

// to stop the handler
public void stop() {
    handler.removeCallbacks(my_runnable);
}

// to reset the handler
public void restart() {
    handler.removeCallbacks(my_runnable);
    handler.postDelayed(my_runnable, 10000);
}

ハンドラを使用してタイマーを作成する(javax.swing.Timerと同様)

これは、数秒おきにコードを実行する必要のあるゲームなどを作成する場合に便利です。

import android.os.Handler;

public class Timer {
    private Handler handler;
    private boolean paused;

    private int interval;

    private Runnable task = new Runnable () {
        @Override
        public void run() {
            if (!paused) {
                runnable.run ();
                Timer.this.handler.postDelayed (this, interval);
            }
        }
    };

    private Runnable runnable;

    public int getInterval() {
        return interval;
    }

    public void setInterval(int interval) {
        this.interval = interval;
    }

    public void startTimer () {
        paused = false;
        handler.postDelayed (task, interval);
    }

    public void stopTimer () {
        paused = true;
    }

    public Timer (Runnable runnable, int interval, boolean started) {
        handler = new Handler ();
        this.runnable = runnable;
        this.interval = interval;
        if (started)
            startTimer ();
    }
}

使用例:

Timer timer = new Timer(new Runnable() {
    public void run() {
        System.out.println("Hello");
    }
}, 1000, true)

このコードは毎秒 "Hello"を出力します。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow