Мне нужно проверить, является ли поток, выполняющий определенный кусок кода, основным потоком (UI) или нет. Как мне этого добиться?
java
android
multithreading
Charlie-Blake
источник
источник
Ответы:
если это возвращает true, то вы в потоке пользовательского интерфейса!
источник
Вы можете использовать приведенный ниже код, чтобы узнать, является ли текущий поток пользовательским интерфейсом / основным потоком или нет
или вы также можете использовать это
Вот похожий вопрос
источник
Looper.myLooper()
вернет ноль, если поток не связан с Looper. Таким образом, оба безопасны и имеют одинаковый результат, но первый немного медленнее, когда он ищет внутри карты, чтобы найти петлитель и связанный с ним поток и сделать что-то еще.Лучший способ - самый ясный, самый надежный способ: *
Или, если рабочая среда имеет уровень API 23 (Marshmallow 6.0) или выше:
Смотрите API Looper . Обратите внимание, что вызов
Looper.getMainLooper()
включает синхронизацию (см. Источник ). Возможно, вы захотите избежать накладных расходов, сохраняя возвращаемое значение и используя его повторно.* кредит greg7gkb и 2cupsOfTech
источник
Looper.myLooper() == Looper.getMainLooper()
, что, я думаю, менее понятно. Я кредит greg7gkb.equals
и поэтому возвращается к нему==
, но это может измениться в будущем. Поэтому я исправил ответ.Подводя итог решениям, я думаю, что это лучшее:
И, если вы хотите запустить что-то в потоке пользовательского интерфейса, вы можете использовать это:
источник
Ты можешь проверить
источник
Позвольте мне предвосхитить это следующим образом: я признал, что в этом сообщении есть тег «Android», однако мой поиск не имеет ничего общего с «Android», и это был мой лучший результат. В связи с этим, для не-Android SO пользователей Java, приземляющихся здесь, не забудьте о:
После установки этого в другом месте вашего кода вы можете легко проверить, собираетесь ли вы выполнять в главном потоке:
Немного смутившись, я искал, прежде чем вспомнить это, но, надеюсь, это поможет кому-то еще!
источник
Вы можете проверить это в android ddms logcat, где идентификатор процесса будет таким же, но идентификатор потока будет другим.
источник
Xamarin.Android
порт: (C#
)Применение:
источник
Вы можете попробовать Thread.currentThread (). IsDaemon ()
источник