wake-up-neo.net

So prüfen Sie, ob der aktuelle Thread kein Hauptthread ist

Ich muss überprüfen, ob der Thread, der ein bestimmtes Stück Code ausführt, der Haupt-Thread (UI) ist oder nicht. Wie kann ich das erreichen?

320
1CjaWfbSbARo
Looper.myLooper() == Looper.getMainLooper()

wenn dies true zurückgibt, sind Sie im UI-Thread!

607
Carnal

sie können den folgenden Code verwenden, um festzustellen, ob der aktuelle Thread ein UI/Main-Thread ist oder nicht

if(Looper.myLooper() == Looper.getMainLooper()) {
   // Current Thread is Main Thread.
}

oder Sie können dies auch verwenden 

if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
   // Current Thread is Main Thread.
}

Hier ist ähnliche Frage

103
AAnkit

Der beste Weg ist der klarste und robusteste Weg: *

Thread.currentThread().equals( Looper.getMainLooper().getThread() )

Oder, wenn die Laufzeitplattform API-Level 23 (Marshmallow 6.0) oder höher ist:

Looper.getMainLooper().isCurrentThread()

Siehe die Looper API . Beachten Sie, dass der Aufruf von Looper.getMainLooper() eine Synchronisation beinhaltet (siehe source ). Möglicherweise möchten Sie den Aufwand vermeiden, indem Sie den Rückgabewert speichern und erneut verwenden.

* credit greg7gkb und 2cupsOfTech

37
Michael Allan

Zusammenfassend die Lösungen, ich denke, das ist die beste:

boolean isUiThread = VERSION.SDK_INT >= VERSION_CODES.M 
    ? Looper.getMainLooper().isCurrentThread()
    : Thread.currentThread() == Looper.getMainLooper().getThread();

Wenn Sie etwas im UI-Thread ausführen möchten, können Sie Folgendes verwenden:

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
       //this runs on the UI thread
    }
});
17

Du kannst nachschauen  

if(Looper.myLooper() == Looper.getMainLooper()) {
   // You are on mainThread 
}else{
// you are on non-ui thread
}

sie können dies in Android ddms logcat überprüfen, wobei die Prozess-ID identisch ist, die Thread-ID jedoch anders ist.

1
Vishwanath.M

Gestatten Sie mir, Folgendes vorwegzunehmen: Ich habe bestätigt, dass dieser Beitrag den Tag "Android" trägt. Meine Suche hatte jedoch nichts mit "Android" zu tun, und dies war mein Top-Ergebnis. Zu diesem Zweck sollten Sie für nicht für Android SOJava Benutzer, die hier landen, Folgendes nicht vergessen:

public static void main(String[] args{
    Thread.currentThread().setName("SomeNameIChoose");
    /*...the rest of main...*/
}

Nachdem Sie dies an einer anderen Stelle in Ihrem Code festgelegt haben, können Sie leicht überprüfen, ob Sie im Haupt-Thread Folgendes ausführen möchten:

if(Thread.currentThread().getName().equals("SomeNameIChoose"))
{
    //do something on main thread
}

Ein bisschen verlegen hatte ich gesucht, bevor ich mich daran erinnerte, aber hoffentlich hilft es jemand anderem!

0
ThatOneGuy

Xamarin.Android port: (C#)

public bool IsMainThread => Build.VERSION.SdkInt >= BuildVersionCodes.M
    ? Looper.MainLooper.IsCurrentThread
    : Looper.MyLooper() == Looper.MainLooper;

Verwendungszweck:

if (IsMainThread) {
    // you are on UI/Main thread
}
0
Mehdi Dehghani