Мне нужно проверить, является ли поток, выполняющий определенный кусок кода, основным потоком (UI) или нет. Как мне этого добиться?
Мне нужно проверить, является ли поток, выполняющий определенный кусок кода, основным потоком (UI) или нет. Как мне этого добиться?
Ответы:
Looper.myLooper() == Looper.getMainLooper()
если это возвращает true, то вы в потоке пользовательского интерфейса!
Вы можете использовать приведенный ниже код, чтобы узнать, является ли текущий поток пользовательским интерфейсом / основным потоком или нет
if(Looper.myLooper() == Looper.getMainLooper()) {
// Current Thread is Main Thread.
}
или вы также можете использовать это
if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
// Current Thread is Main Thread.
}
Looper.myLooper()
вернет ноль, если поток не связан с Looper. Таким образом, оба безопасны и имеют одинаковый результат, но первый немного медленнее, когда он ищет внутри карты, чтобы найти петлитель и связанный с ним поток и сделать что-то еще.
Лучший способ - самый ясный, самый надежный способ: *
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
Или, если рабочая среда имеет уровень API 23 (Marshmallow 6.0) или выше:
Looper.getMainLooper().isCurrentThread()
Смотрите API Looper . Обратите внимание, что вызов Looper.getMainLooper()
включает синхронизацию (см. Источник ). Возможно, вы захотите избежать накладных расходов, сохраняя возвращаемое значение и используя его повторно.
* кредит greg7gkb и 2cupsOfTech
Looper.myLooper() == Looper.getMainLooper()
, что, я думаю, менее понятно. Я кредит greg7gkb.
equals
и поэтому возвращается к нему ==
, но это может измениться в будущем. Поэтому я исправил ответ.
Подводя итог решениям, я думаю, что это лучшее:
boolean isUiThread = VERSION.SDK_INT >= VERSION_CODES.M
? Looper.getMainLooper().isCurrentThread()
: Thread.currentThread() == Looper.getMainLooper().getThread();
И, если вы хотите запустить что-то в потоке пользовательского интерфейса, вы можете использовать это:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//this runs on the UI thread
}
});
Ты можешь проверить
if(Looper.myLooper() == Looper.getMainLooper()) {
// You are on mainThread
}else{
// you are on non-ui thread
}
Позвольте мне предвосхитить это следующим образом: я признал, что в этом сообщении есть тег «Android», однако мой поиск не имеет ничего общего с «Android», и это был мой лучший результат. В связи с этим, для не-Android SO пользователей Java, приземляющихся здесь, не забудьте о:
public static void main(String[] args{
Thread.currentThread().setName("SomeNameIChoose");
/*...the rest of main...*/
}
После установки этого в другом месте вашего кода вы можете легко проверить, собираетесь ли вы выполнять в главном потоке:
if(Thread.currentThread().getName().equals("SomeNameIChoose"))
{
//do something on main thread
}
Немного смутившись, я искал, прежде чем вспомнить это, но, надеюсь, это поможет кому-то еще!
Вы можете проверить это в android ddms logcat, где идентификатор процесса будет таким же, но идентификатор потока будет другим.
Xamarin.Android
порт: ( C#
)
public bool IsMainThread => Build.VERSION.SdkInt >= BuildVersionCodes.M
? Looper.MainLooper.IsCurrentThread
: Looper.MyLooper() == Looper.MainLooper;
Применение:
if (IsMainThread) {
// you are on UI/Main thread
}
Вы можете попробовать Thread.currentThread (). IsDaemon ()