When to use handler.post() & when to new Thread()

AndroidAndroid HandlerAndroid Thread

Android Problem Overview


I'm wondering when should I use handler.post(runnable); and when should I use new Thread(runnable).start();

It is mentioned in developers documentation for Handler:

> Causes the Runnable r to be added to the message queue. The runnable > will be run on the thread to which this handler is attached.

Does this mean if I write in the onCreate() of Activity class:

Handler handler = new Handler();
handler.post(runnable);

then runnable will be called in a separate thread or in the Activity's thread?

Android Solutions


Solution 1 - Android

You should use Handler.post() whenever you want to do operations on the UI thread.

So let's say you want to change a TextView's text in the callback. Because the callback is not running on the UI thread, you should use Handler.post().

In Android, as in many other UI frameworks, UI elements (widgets) can be only modified from UI thread.

Also note that the terms "UI thread" and "main thread" are often used interchangeably.


Edit: an example of the long-running task:

mHandler = new Handler();

new Thread(new Runnable() {
  @Override
  public void run () {
    // Perform long-running task here
    // (like audio buffering).
    // You may want to update a progress
    // bar every second, so use a handler:
    mHandler.post(new Runnable() {
     @Override
     public void run () {
       // make operation on the UI - for example
       // on a progress bar.
     }
    });
  }
}).start();

Of course, if the task you want to perform is really long and there is a risk that user might switch to some another app in the meantime, you should consider using a Service.

Solution 2 - Android

To answer you specific question:

> Does this mean if in the onCreate of Activity class I write: > > Handler handler = new Handler() hanlder.post(runnable); then, runnable > will be called in a separate thread or on the Activity's thread?

No it won't be. The Runnable will be called on the Main Thread itself. Handler is simply used for posting a message to the thread to which it is attached (where its is created). It does not create a thread on its own. In your example, you created a Handler in the main Thread (that where Activity.OnCreate() is called) and hence any message posted on such a Handler will be run on the Main Thread only.

Solution 3 - Android

Example is jacked:

mHandler = new Handler();
new Thread(new Runnable(){
  @Override
  public void run () {
    mHandler.post(new Runnable() {
     @Override
     public void run () {
       mUiView.setX(x);
     }
    });
  }
}).start();

Alternatively you can skip the handler and use the post method on the view directly:

new Thread(new Runnable(){
  @Override
  public void run () {
    mUiView.post(new Runnable() {
     @Override
     public void run () {
       mUiView.setX(x);
     }
    });
  }
}).start();

This is a good post that outlines the difference: https://stackoverflow.com/questions/13840007/what-exactly-does-the-post-method-do

Solution 4 - Android

use handler.post() when you want to post the code (usually from background thread) to the main thread. Yea, POST,just like you, post a letter to someone. With the help of handler the code will be executed ASAP i.e. almost immediately.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionreileyView Question on Stackoverflow
Solution 1 - AndroidkamituelView Answer on Stackoverflow
Solution 2 - AndroidpareshgoelView Answer on Stackoverflow
Solution 3 - AndroidworkedView Answer on Stackoverflow
Solution 4 - Androiduser2768308View Answer on Stackoverflow