Как проверить, не является ли текущий поток не основным потоком

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