Мне нужно проверить, является ли поток, выполняющий определенный фрагмент кода, основным (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()
