Чтобы обновить GUI из других потоков, в основном существуют два основных подхода:
-
Используйте java.lang.Runnable с помощью любого из этих методов:
Activity.runOnUiThread(Runnable) View.post(Runnable) View.postDelayed(Runnable, long) Handler.post(Runnable)
-
Использование android.os.Message:
Handler.sendMessage(Message) / Handler.handleMessage(Message)
Вы также можете использовать AsyncTask, но мой вопрос более сфокусирован на прецеденте обновления очень простого компонента. Посмотрим, как это будет сделано с использованием обоих подходов:
-
Использование Runnables:
TextViev tv = ...; final String data = "hello"; Runnable r = new Runnable() { @Override public void run(){ tv.setText(data); } }; //Now call Activity.runOnUiThread(r) or handler.post(r), ...
-
Использование сообщений:
Message m = handler.obtainMessage(UPDATE_TEXT_VIEW, "hello"); handler.sendMessage(m); //Now on handler implementation: @Override public void handleMessage(Message msg) { if(msg.what == UPDATE_TEXT_VIEW){ String s = (String) msg.obj; tv.setText(data); } ... //other IFs? }
IMHO, сообщения не подходят, потому что:
- Нелегко понять для новых программистов, не относящихся к андроиду (обработчик привязывается к своей нити во время построения).
- Полезная нагрузка объекта должна быть Parcellable, если сообщение пересекает границы процесса.
- Сообщения повторно используются (ошибка подвержена неправильной очистке?)
- Обработчик имеет двойную роль (он отправляет сообщения, но также обрабатывает их)
- Атрибуты сообщений общедоступны, но также предлагают getter/setter.
С другой стороны, Runnables следуют хорошо известному шаблону команды и более удобны в программировании и читабельны.
Итак, каковы преимущества использования сообщений над Runnables? Сообщения, введенные в фоновом режиме в современных Android-программах? Есть ли что-нибудь, что вы можете сделать с Сообщениями, которые нельзя сделать с помощью Runnables?
Спасибо заранее.