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?
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.To answer you specific question:
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.
Example is jacked:
Alternatively you can skip the handler and use the post method on the view directly:
This is a good post that outlines the difference: What exactly does the post method do?
You should use
Handler.post()
whenever you want to do operations in the UI thread.So let's say in the callback (which is running in separate thread) you want to change a
TextView
's text, you should useHandler.post()
.In Android, as in many other UI frameworks, UI elements (widgets) can be only modified from main thread.
Edit: the example of long-running tasks
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.