问题
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?
回答1:
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 use Handler.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
mHandler = new Handler();
new Thread(new Runnable() {
@Override
public void run () {
// Perform long-running task here
// (like audio buffering).
// you may want to update some progress
// bar every second, so use handler:
mHandler.post(new Runnable() {
@Override
public void run () {
// make operation on UI - on example
// on 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.
回答2:
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.
回答3:
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: What exactly does the post method do?
回答4:
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.
来源:https://stackoverflow.com/questions/15136199/when-to-use-handler-post-when-to-new-thread