web-dev-qa-db-ja.com

タイマータスクまたはハンドラー

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つが別のアプローチよりも効率的である理由(実際にそうである場合)を説明していただければ幸いです。

91
keysersoze

HandlerTimerTaskよりも優れています。

Java TimerTaskとAndroid Handlerの両方を使用すると、バックグラウンドスレッドで遅延タスクと繰り返しタスクをスケジュールできます。ただし、AndroidでHandlerよりもTimerTaskを使用することを強くお勧めします( hereherehereherehere 、および here )。

TimerTaskに関して報告されている問題には次のものがあります。

  • UIスレッドを更新できません
  • メモリリーク
  • 信頼できない(常に機能するとは限らない)
  • 長時間実行されるタスクは、次にスケジュールされているイベントに干渉する可能性があります

私が見たすべての種類の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);

関連

82
Suragch

タイマーを使用することにはいくつかの欠点があります

タスクを実行するために単一のスレッドのみを作成し、タスクの実行に時間がかかりすぎると、他のタスクが影響を受けます。タスクによってスローされた例外を処理せず、スレッドが終了するだけで、他のスケジュールされたタスクに影響し、実行されません

コピー元:

TimerTask vs Thread.sleep vs Handler postDelayed-Nミリ秒ごとに関数を呼び出すのが最も正確ですか?

17
Praveena

受け入れられた回答の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)
1
sma6871