Когда использовать handler.post () и когда в новую тему ()

Мне интересно, когда следует использовать handler.post(runnable); И когда следует использовать new Thread(runnable).start();

В документации разработчиков для Handler указано:

Заставляет Runnable r добавляться в очередь сообщений. Runnable будет запущен в потоке, к которому прикреплен этот обработчик.

Означает ли это, если я пишу в onCreate() класса Activity :

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

То runnable будет вызываться в отдельном потоке или в потоке Activity?

Вы должны использовать Handler.post() когда хотите выполнять операции в потоке пользовательского интерфейса.

Итак, скажем, в 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(); 

Конечно, если задача, которую вы хотите выполнить, действительно длинна, и существует риск того, что пользователь может переключиться на какое-то другое приложение тем временем, вам следует рассмотреть возможность использования Сервиса .

Пример:

 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(); 

Это хорошая статья, в которой описывается разница: что именно делает метод post?

Чтобы ответить на конкретный вопрос:

Означает ли это, если в классе onCreate of Activity я пишу:

Обработчик обработчика = новый обработчик () hanlder.post (runnable); То runnable будет вызываться в отдельном потоке или в потоке активности?

Нет, этого не будет. Runnable будет вызываться непосредственно в главной теме. Обработчик просто используется для размещения сообщения в потоке, к которому он прикреплен (где он создан). Он не создает поток самостоятельно. В вашем примере вы создали обработчик в основном потоке (который вызывается с вызовом Activity.OnCreate ()), и поэтому любое сообщение, отправленное на таком обработчике, будет выполняться только в основном потоке.

Используйте handler.post() когда вы хотите опубликовать код (обычно из фонового потока) в основной поток . Да, POST, как и вы, отправьте письмо кому-то. С помощью обработчика код будет выполняться ASAP, т.е. почти сразу.