Android
ハンドラ
サーチ…
備考
ハンドラは、遅延された時間の後にコードを実行するために簡単に使用できます。また、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
は、 Message
とRunnable
をスレッドのメッセージキューに送信するため、複数のスレッド間でイベントベースの通信を実装するのは簡単です。 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