Muszę sprawdzić, czy wątek uruchamiający określony fragment kodu jest wątkiem głównym (UI), czy nie. Jak mogę to osiągnąć?
java
android
multithreading
Charlie-Blake
źródło
źródło
Odpowiedzi:
jeśli to zwraca wartość true, oznacza to, że jesteś w wątku interfejsu użytkownika!
źródło
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
lub możesz także tego użyć
Oto podobne pytanie
źródło
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: *
Lub, jeśli platforma uruchomieniowa ma interfejs API na poziomie 23 (Marshmallow 6.0) lub nowszym:
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
źródło
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:
A jeśli chcesz uruchomić coś w wątku interfejsu użytkownika, możesz użyć tego:
źródło
Możesz sprawdzić
źródło
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:
Po ustawieniu tego w innym miejscu kodu możesz łatwo sprawdzić, czy zamierzasz wykonać główny wątek za pomocą:
Trochę zawstydzony, szukałem, zanim to zapamiętałem, ale mam nadzieję, że pomoże to komuś innemu!
źródło
możesz to zweryfikować w Android ddms logcat, gdzie identyfikator procesu będzie taki sam, ale identyfikator wątku będzie inny.
źródło
Xamarin.Android
port: (C#
)Stosowanie:
źródło
Możesz wypróbować Thread.currentThread (). IsDaemon ()
źródło