Подтвердить что ты не робот

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

Мне нужно проверить, является ли поток, выполняющий определенный фрагмент кода, основным (UI) потоком или нет. Как я могу достичь этого?

4b9b3361

Ответ 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()