Мне нужно проверить, является ли поток, выполняющий определенный фрагмент кода, основным (UI) потоком или нет. Как я могу достичь этого?
Как проверить, не является ли текущий поток не основным потоком
Ответ 1
Looper.myLooper() == Looper.getMainLooper()
если это возвращает true, тогда вы находитесь в потоке пользовательского интерфейса!
Ответ 2
вы можете использовать нижеприведенный код, чтобы узнать, является ли текущий поток UI/Основной поток или нет
if(Looper.myLooper() == Looper.getMainLooper()) {
// Current Thread is Main Thread.
}
или вы также можете использовать этот
if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
// Current Thread is Main Thread.
}
Ответ 3
Лучший способ - самый ясный, самый надежный способ: *
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
Или, если рабочая среда имеет уровень API 23 (Marshmallow 6.0) или выше:
Looper.getMainLooper().isCurrentThread()
См. Looper API. Обратите внимание, что вызов Looper.getMainLooper()
включает синхронизацию (см. источник). Возможно, вы захотите избежать накладных расходов, сохранив возвращаемое значение и повторно его применив.
* кредит greg7gkb и 2cupsOfTech
Ответ 4
Подводя итог решениям, я считаю, что лучший:
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
}
});
Ответ 5
Ты можешь проверить
if(Looper.myLooper() == Looper.getMainLooper()) {
// You are on mainThread
}else{
// you are on non-ui thread
}
Ответ 6
вы можете проверить его в logcat android ddms, где идентификатор процесса будет таким же, но идентификатор потока будет другим.
Ответ 7
Xamarin.Android
Порт 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
}
Ответ 8
Позвольте мне предвосхитить это: Я признал, что в этой записи есть тег "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
}
Немного смутившись, я искал, прежде чем вспомнить это, но, надеюсь, это поможет кому-то еще!
Ответ 9
Вы можете попробовать Thread.currentThread(). isDaemon()