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?
Looper.myLooper() == Looper.getMainLooper()
wenn dies true zurückgibt, sind Sie im UI-Thread!
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.
}
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
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
}
});
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.
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!
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
}