Когда использовать handler.post() и когда в новую тему()
Мне интересно, когда следует использовать handler.post(runnable);
, и когда следует использовать
new Thread(runnable).start();
В документации разработчиков для обработчика упоминается:
Заставляет Runnable r добавляться в очередь сообщений. Управляемый будет выполняться в потоке, к которому прикреплен этот обработчик.
Означает ли это, если я пишу в классе onCreate()
класса Activity
:
Handler handler = new Handler();
handler.post(runnable);
то runnable будет вызываться в отдельном потоке или в потоке активности?
Ответы
Ответ 1
Вы должны использовать Handler.post()
всякий раз, когда хотите выполнять операции в потоке пользовательского интерфейса.
Итак, скажем, в обратном вызове (который выполняется в отдельном потоке) вы хотите изменить текст TextView
, вы должны использовать Handler.post()
.
В Android, как и во многих других интерфейсах пользовательского интерфейса, элементы пользовательского интерфейса (виджеты) могут быть изменены только из основного потока.
Изменить: пример длительных задач
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();
Конечно, если задача, которую вы хотите выполнить, действительно длинна, и есть риск, что пользователь может переключиться на какое-то другое приложение, тем не менее, вам следует рассмотреть возможность использования Service.
Ответ 2
Чтобы ответить на конкретный вопрос:
Означает ли это, если в классе onCreate of Activity я пишу:
Обработчик обработчика = новый обработчик() hanlder.post(runnable); затем, runnable будет вызываться в отдельном потоке или в потоке активности?
Нет, этого не будет. Runnable будет вызываться непосредственно в главной теме.
Обработчик просто используется для размещения сообщения в потоке, к которому он прикреплен (где он создан).
Он не создает поток самостоятельно.
В вашем примере вы создали обработчик в основном потоке (там, где вызывается Activity.OnCreate()), и поэтому любое сообщение, отправленное на таком обработчике, будет выполняться только в основном потоке.
Ответ 3
Пример:
mHandler = new Handler();
new Thread(new Runnable(){
@Override
public void run () {
mHandler.post(new Runnable() {
@Override
public void run () {
mUiView.setX(x);
}
});
}
}).start();
В качестве альтернативы вы можете пропустить обработчик и напрямую использовать метод post в представлении:
new Thread(new Runnable(){
@Override
public void run () {
mUiView.post(new Runnable() {
@Override
public void run () {
mUiView.setX(x);
}
});
}
}).start();
Это хорошая публикация, которая описывает разницу: Что именно делает почтовый метод?
Ответ 4
используйте handler.post()
, если вы хотите отправить код (обычно из фонового потока) в основной поток. Да, POST, как и вы, отправьте письмо кому-то. С помощью обработчика код будет выполнен ASAP, т.е. почти сразу.