Обновление GUI: Runnables vs Messages

Для обновления GUI из других потоков существует два основных подхода:

  1. Используйте java.lang.Runnable с любым из этих методов:

    Activity.runOnUiThread(Runnable)
    View.post(Работоспособный)
    View.postDelayed(Runnable, long)
    Handler.post(Запускаемый)
    
  2. Используйте android.os.Message:

    Handler.sendMessage(Message) / Handler.handleMessage(Message)
    

Вы также можете использовать AsyncTask, но мой вопрос больше касается случая использования обновления очень простого компонента. Давайте посмотрим, как это будет сделано с использованием обоих подходов:

  1. Используя Runnables:

    TextViev tv = ...;
    окончательные данные строки = "привет";
    Runnable r = новый Runnable () {
    
     @Override
    публичный недействительный запуск () {
    тв.setText (данные);
     }
    
    };
    //Теперь вызовите Activity.runOnUiThread(r) или handler.post(r), ...
    
  2. Использование сообщений:

    Сообщение m = handler.obtainMessage(UPDATE_TEXT_VIEW, "hello");
    обработчик.отправитьСообщение(м);
    
    // Теперь о реализации обработчика:
     @Override
    public void handleMessage (сообщение msg) {
    если (msg.what == UPDATE_TEXT_VIEW){
    Строка s = (Строка) msg.obj;
    тв.setText (данные);
     } ... //другие ЕСЛИ?
     }
    

ИМХО, сообщения не подходят, потому что:

  • Нелегко понять новичкам, не работающим на Android-программистах (обработчик подключается к своему потоку во время создания).
  • Полезная нагрузка объекта должна быть Parcellable, если сообщение пересекает границы процесса.
  • Сообщения используются повторно (подвержены ошибкам, если они не очищены должным образом?)
  • Обработчик выполняет двойную роль (он отправляет сообщения, но также и обрабатывает их)
  • Атрибуты сообщений общедоступны, но также предлагают геттер/сеттер.

С другой стороны, Runnables следуют хорошо известному шаблону команд и более удобны для программиста и читабельны.

Итак, каковы преимущества использования Messages по сравнению с Runnables? Отодвинуты ли сообщения на задний план в современном программировании для Android? Есть ли что-то, что вы можете сделать с сообщениями, чего нельзя сделать с помощью Runnables?

Заранее спасибо.

46
задан Mister Smith 26 June 2012 в 13:12
поделиться