Зачем использовать обработчики, в то время как runOnUiThread делает то же самое?

Я столкнулся с понятиями Handlers и runOnUiThread . Но для меня это все еще кажется сомнением в отношении того, какие факты они точно различают.

Оба они предназначены для выполнения действий пользовательского интерфейса из фонового потока. Но каковы факторы, которые следует учитывать, когда мы выбираем среди этих двух методов.

Например, рассмотрим Runnable Thread который выполняет веб-службу в фоновом режиме, и теперь я хочу обновить интерфейс.

Какой был бы лучший способ обновить мой интерфейс? Должен ли я идти для Handler или runOnUiThread ?

Я все еще знаю, что могу использовать AsyncTask и использовать onPostExecute . Но я просто хочу знать разницу.

Activity.runOnUiThread () является особым случаем более общих обработчиков . С помощью Handler вы можете создать свой собственный запрос событий в своем потоке. Использование Handlers созданных с помощью конструктора по умолчанию , не означает, что « код будет работать в потоке пользовательского интерфейса » вообще. По умолчанию обработчики привязаны к Thread из которого они были созданы.

Чтобы создать Handler который гарантированно привязан к потоку пользовательского интерфейса (main), вы должны создать объект Handler привязанный к Main Looper следующим образом:

 Handler mHandler = new Handler(Looper.getMainLooper()); 

Более того, если вы проверяете реализацию метода runOnuiThread() , он использует Handler для выполнения следующих runOnuiThread() :

  public final void runOnUiThread(Runnable action) { if (Thread.currentThread() != mUiThread) { mHandler.post(action); } else { action.run(); } } 

Как вы можете видеть из фрагмента кода выше, Runnable action будет выполнено немедленно, если runOnUiThread() вызывается из потока пользовательского интерфейса. В противном случае он отправит его Handler , который будет выполнен в какой-то момент позже.

Обработчик имеет много функций, таких как передача сообщений и частое обновление пользовательского интерфейса, если вы запускаете Thread для любого запуска задачи. Обработчик позволяет отправлять и обрабатывать объекты Message и Runnable, связанные с MessageQueue потока, что очень полезно во многих приложениях, таких как bluetooth Chat, wifi chat … и обработчик имеет метод PostDelay и PostAtTime, с помощью которого вы можете играть вокруг любого вида для анимации и изменения видимости и т. Д.

Вы должны посмотреть в этом

http://developer.android.com/guide/components/processes-and-threads.html

http://developer.android.com/tools/testing/activity_testing.html

Обработчики были старыми способами (API Level 1), и затем были введены AsycTask (API Level 3), а также более сильный упор на использование runOnUIThread (API Level 1). Вы должны избегать использования обработчиков в максимально возможной степени и предпочитаете другие два в зависимости от ваших потребностей.

После ответа HitOdessit.

Вы можете создать такой класс.

 public class Global{ private static Handler mHandler = new Handler(Looper.getMainLooper()); public static void runOnUiThread(Runnable action){ mHandler.post(action); } } 

И тогда назовите это так.

 Global.runOnUiThread(new Runnable(){ //Your code }); 

И это можно запустить из любого места (где у вас есть доступ к вашему глобальному классу).

Intereting Posts
Не удалось найти инструмент. Пожалуйста, предоставьте правильный путь к каталогу Android SDK в качестве параметра конфигурации Как отключить запрос Volley от повторной попытки? Время таймера обратного отсчета андроидов Facebook SDK + SlidingMenu SDK = несоответствие Jar! Исправьте свои зависимости Размеры экрана Android в пикселях для ldpi, mdpi, hpdi? SQLiteAssetHelper: не удалось открыть базу данных для записи (попробуйте только чтение) Как получить доступ к представлениям оригинальной активности из созданной фоновой службы Не нашел класс «com.google.firebase.provider.FirebaseInitProvider» ActionbarSherlock – вкладки не реагируют в альбомной ориентации Как получить путь к ADB в build.gradle Как я могу подавать код валюты ISO4217 в NumberFormat? Android-град построит покрытие кода для рубоэлектрических тестов Преобразовать float в CharSequence в android? Как использовать общую библиотеку в native-activity Модульные тесты в Android Studio 0.8