Muszę sprawdzić, czy wątek uruchamiający określony fragment kodu jest wątkiem głównym (UI), czy nie. Jak mogę to osiągnąć?
Muszę sprawdzić, czy wątek uruchamiający określony fragment kodu jest wątkiem głównym (UI), czy nie. Jak mogę to osiągnąć?
Odpowiedzi:
Looper.myLooper() == Looper.getMainLooper()
jeśli to zwraca wartość true, oznacza to, że jesteś w wątku interfejsu użytkownika!
możesz użyć poniższego kodu, aby dowiedzieć się, czy bieżący wątek to interfejs użytkownika / główny wątek, czy nie
if(Looper.myLooper() == Looper.getMainLooper()) {
// Current Thread is Main Thread.
}
lub możesz także tego użyć
if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
// Current Thread is Main Thread.
}
Looper.myLooper()
zwróci null, jeśli wątek nie jest powiązany z Looper. Oba są więc bezpieczne i mają ten sam wynik, ale pierwszy jest nieco wolniejszy, gdy przeszukuje mapę, aby znaleźć looper i związany z nim wątek i zrobić kilka innych rzeczy.
Najlepszy sposób to najczystszy, najsolidniejszy sposób: *
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
Lub, jeśli platforma uruchomieniowa ma interfejs API na poziomie 23 (Marshmallow 6.0) lub nowszym:
Looper.getMainLooper().isCurrentThread()
Zobacz Looper API . Pamiętaj, że wywoływanie Looper.getMainLooper()
wymaga synchronizacji (patrz źródło ). Możesz uniknąć kosztów ogólnych, przechowując wartość zwracaną i ponownie ją wykorzystując.
* kredyt greg7gkb i 2cupsOfTech
Looper.myLooper() == Looper.getMainLooper()
, co moim zdaniem jest mniej jasne. Kredytuję greg7gkb.
equals
i dlatego wraca do ==
, ale może się to zmienić w przyszłości. Więc poprawiłem odpowiedź.
Podsumowując rozwiązania, myślę, że to najlepsze:
boolean isUiThread = VERSION.SDK_INT >= VERSION_CODES.M
? Looper.getMainLooper().isCurrentThread()
: Thread.currentThread() == Looper.getMainLooper().getThread();
A jeśli chcesz uruchomić coś w wątku interfejsu użytkownika, możesz użyć tego:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//this runs on the UI thread
}
});
Możesz sprawdzić
if(Looper.myLooper() == Looper.getMainLooper()) {
// You are on mainThread
}else{
// you are on non-ui thread
}
Pozwólcie, że przedstawię to następująco: Potwierdziłem, że ten post ma tag „Android”, jednak moje wyszukiwanie nie miało nic wspólnego z „Androidem” i to był mój najlepszy wynik. W tym celu w przypadku użytkowników Java SO non-Android lądujących tutaj nie zapomnij o:
public static void main(String[] args{
Thread.currentThread().setName("SomeNameIChoose");
/*...the rest of main...*/
}
Po ustawieniu tego w innym miejscu kodu możesz łatwo sprawdzić, czy zamierzasz wykonać główny wątek za pomocą:
if(Thread.currentThread().getName().equals("SomeNameIChoose"))
{
//do something on main thread
}
Trochę zawstydzony, szukałem, zanim to zapamiętałem, ale mam nadzieję, że pomoże to komuś innemu!
możesz to zweryfikować w Android ddms logcat, gdzie identyfikator procesu będzie taki sam, ale identyfikator wątku będzie inny.
Xamarin.Android
port: ( C#
)
public bool IsMainThread => Build.VERSION.SdkInt >= BuildVersionCodes.M
? Looper.MainLooper.IsCurrentThread
: Looper.MyLooper() == Looper.MainLooper;
Stosowanie:
if (IsMainThread) {
// you are on UI/Main thread
}
Możesz wypróbować Thread.currentThread (). IsDaemon ()