Timertask or Handler Timertask or Handler android android

Timertask or Handler


Handler is better than TimerTask.

The Java TimerTask and the Android Handler both allow you to schedule delayed and repeated tasks on background threads. However, the literature overwhelmingly recommends using Handler over TimerTask in Android (see here, here, here, here, here, and here).

Some of reported problems with TimerTask include:

  • Can't update the UI thread
  • Memory leaks
  • Unreliable (doesn't always work)
  • Long running tasks can interfere with the next scheduled event

Example

The best source for all kinds of Android examples that I have seen is at Codepath. Here is a Handler example from there for a repeating task.

// Create the Handler object (on the main thread by default)Handler handler = new Handler();// Define the code block to be executedprivate 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 handlerhandler.post(runnableCode);

Related


There are some disadvantages of using Timer

It creates only single thread to execute the tasks and if a task takes too long to run, other tasks suffer. It does not handle exceptions thrown by tasks and thread just terminates, which affects other scheduled tasks and they are never run

Copied from:

TimerTask vs Thread.sleep vs Handler postDelayed - most accurate to call function every N milliseconds?


Kotlin version of accepted answer:

// execute on the main thread, empty constructor is deprecatedval handler = Handler(Looper.getMainLooper())val runnableCode = object : Runnable {    override fun run() {        Log.d("Handlers", "Called on main thread")        handler.postDelayed(this, 2000)    }}// or shorter using a lambda functionval runnableCode = Runnable {    Log.d("Handlers", "Called on main thread")    handler.postDelayed(this, 2000)}handler.post(runnableCode)