10秒ごとに何らかのアクションを実行したいとしますが、必ずしもビューを更新する必要はありません。
問題は、次のようにtimertaskでtimerを使用する方がよい(私はより効率的かつ効果的であることを意味する)ことです。
final Handler handler = new Handler();
TimerTask timertask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
<some task>
}
});
}
};
timer = new Timer();
timer.schedule(timertask, 0, 15000);
}
または単にpostdelayedを持つハンドラー
final Handler handler = new Handler();
final Runnable r = new Runnable()
{
public void run()
{
<some task>
}
};
handler.postDelayed(r, 15000);
また、どのアプローチをいつ使用するのか、そしてそれらの1つが別のアプローチよりも効率的である理由(実際にそうである場合)を説明していただければ幸いです。
Handler
はTimerTask
よりも優れています。
Java TimerTask
とAndroid Handler
の両方を使用すると、バックグラウンドスレッドで遅延タスクと繰り返しタスクをスケジュールできます。ただし、AndroidでHandler
よりもTimerTask
を使用することを強くお勧めします( here 、 here 、 here 、 here 、 here 、および here )。
TimerTaskに関して報告されている問題には次のものがあります。
例
私が見たすべての種類のAndroidの例の最適なソースは、 Codepath です。ここに、繰り返しタスクのHandler
の例を示します。
// Create the Handler object (on the main thread by default)
Handler handler = new Handler();
// Define the code block to be executed
private Runnable runnableCode = new Runnable() {
@Override
public void run() {
// Do something here on the main thread
Log.d("Handlers", "Called on main thread");
// Repeat this the same runnable code block again another 2 seconds
handler.postDelayed(runnableCode, 2000);
}
};
// Start the initial runnable task by posting through the handler
handler.post(runnableCode);
関連
タイマーを使用することにはいくつかの欠点があります
タスクを実行するために単一のスレッドのみを作成し、タスクの実行に時間がかかりすぎると、他のタスクが影響を受けます。タスクによってスローされた例外を処理せず、スレッドが終了するだけで、他のスケジュールされたタスクに影響し、実行されません
コピー元:
TimerTask vs Thread.sleep vs Handler postDelayed-Nミリ秒ごとに関数を呼び出すのが最も正確ですか?
受け入れられた回答のKotlinバージョン:
val handler = Handler()
val runnableCode = object : Runnable {
override fun run() {
Log.d("Handlers", "Called on main thread")
handler.postDelayed(this, 2000)
}
}
handler.post(runnableCode)