Ich muss überprüfen, ob der Thread, auf dem ein bestimmter Code ausgeführt wird, der Hauptthread (UI) ist oder nicht. Wie kann ich das erreichen?
Ich muss überprüfen, ob der Thread, auf dem ein bestimmter Code ausgeführt wird, der Hauptthread (UI) ist oder nicht. Wie kann ich das erreichen?
Antworten:
Looper.myLooper() == Looper.getMainLooper()
Wenn dies true zurückgibt, befinden Sie sich im UI-Thread!
Sie können den folgenden Code verwenden, um festzustellen, ob der aktuelle Thread 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.
}
Looper.myLooper()
gibt null zurück, wenn der Thread keinem Looper zugeordnet ist. Beide sind also sicher und haben das gleiche Ergebnis, aber das erste ist etwas langsamer, während es in einer Karte sucht, um den Looper und den zugehörigen Thread herauszufinden und andere Dinge zu tun.
Der beste Weg ist der klarste und robusteste: *
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 das Aufrufen Looper.getMainLooper()
eine Synchronisierung beinhaltet (siehe Quelle ). Möglicherweise möchten Sie den Overhead vermeiden, indem Sie den Rückgabewert speichern und wiederverwenden.
* Kredit greg7gkb und 2cupsOfTech
Looper.myLooper() == Looper.getMainLooper()
, was meiner Meinung nach weniger klar ist. Ich schreibe greg7gkb gut.
equals
und daher zurückfällt. Dies ==
könnte sich jedoch in Zukunft ändern. Also habe ich die Antwort korrigiert.
Zusammenfassend denke ich, dass dies die beste ist:
boolean isUiThread = VERSION.SDK_INT >= VERSION_CODES.M
? Looper.getMainLooper().isCurrentThread()
: Thread.currentThread() == Looper.getMainLooper().getThread();
Und wenn Sie etwas auf dem 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
}
Gestatten Sie mir Folgendes: Ich habe bestätigt, dass dieser Beitrag das Tag "Android" enthält. Meine Suche hatte jedoch nichts mit "Android" zu tun, und dies war mein Top-Ergebnis. Vergessen Sie zu diesem Zweck für Nicht-Android- SO-Java-Benutzer, die hier landen, Folgendes nicht:
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 Hauptthread 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!
Sie können es in android ddms logcat überprüfen, wo die Prozess-ID identisch ist, die Thread-ID jedoch unterschiedlich ist.
Xamarin.Android
Hafen: ( 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
}
Sie können Thread.currentThread (). IsDaemon () ausprobieren