Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 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, т.е. почти сразу.