Czy jest jakiś sposób na Androidzie, aby wiedzieć, czy wątek z moim kodem jest wątkiem interfejsu użytkownika, czy nie? W huśtawce było SwingUtilities.isEventDispatchThread()
, aby powiedzieć mi, czy jestem w wątku UI, czy nie. Czy w zestawie SDK systemu Android jest jakaś funkcja, która pozwala mi o tym wiedzieć?Jak sprawdzić, czy ten wątek jest wątkiem interfejsu użytkownika
Odpowiedz
Odpowiedź pożyczone stąd: How to check if current thread is not main thread
Looper.myLooper() == Looper.getMainLooper()
Wszelkie Android aplikacja ma tylko jeden wątek UI, więc można gdzieś w zwrotnego aktywność jak onCreate() sprawdzić i zapisać swój identyfikator i później po prostu porównaj identyfikator tego wątku z zapisanym.
mMainThreadId = Thread.currentThread().getId();
W każdym razie, można pominąć sprawdzanie jeśli chcesz zrobić coś na wątku UI i mają żadnego odniesienia do aktywności za pomocą
mActivity.runOnUiThread(new Runnable() { @Override public void run() { ... } });
która jest gwarantowana do pracy na bieżący wątek, jeśli jest to interfejs użytkownika lub umieszczony w kolejce w wątku interfejsu użytkownika.
Hum faktycznie ze względu na architekturę Androida, wszystkie działania wykonywane są w wątku głównym, tj. Wątku interfejsu użytkownika. Więc kiedy kodujesz aktywność, wszystko, co jest w twojej Działalności, jest w wątku UI.
Dlatego w Honeycomb został dodany błąd podczas wykonywania połączeń sieciowych w głównym wątku: całkowicie blokuje interfejs użytkownika.
Domyślnie w rzeczywistości zawsze działasz w wątku interfejsu użytkownika. Inną rzeczą: jeśli wyraźnie nie poprosisz, aby był w innym wątku, usługa będzie działać na tym samym wątku, co działania aplikacji.
Co robić?
- Kiedy musisz wykonać ciężkie obliczenia w swojej działalności; jednym z rozwiązań jest użycie AsyncTask (klasy zaprojektowanej, aby umożliwić ci łatwe używanie innego wątku). Kod w onExecute() jest uruchamiany w innym wątku (ale bądź ostrożny postExecute działa w głównym wątku). Innym jest ręczne uruchamianie nowego wątku, gdy AsyncTask nie jest naprawdę dostosowany.
- Jeśli utworzysz usługę, która wykonuje kosztowne zadania w tle, uruchom ją w innym wątku z atrybutem android: process = ": my_process" manifestu. Będziesz musiał utworzyć AIDL, aby komunikować się z tą oddzielną usługą, ale nie jest to skomplikowane zadanie.
- Wiele obiektów, takich jak na przykład MediaPlayer, ma odmiany Asynchroniczne swoich metod. Staraj się zawsze z nich korzystać.
Umieść punkt przerwania w miejscu, w którym chcesz sprawdzić, a gdy zostanie trafiony, sprawdź, czy możesz wejść w interakcję z interfejsem użytkownika (tzn. Czy interfejs nie jest zamrożony). Jeśli nie możesz wejść w interakcję z interfejsem, to jesteś w wątku UI, w przeciwnym razie jesteś w wątku tła.
Tak, jest sposób. Sprawdź bieżący obiekt wątku przed głównym obiektem wątku loppera. Główny looper jest zawsze w wątku UI.
boolean isOnUiThread = Thread.currentThread() == Looper.getMainLooper().getThread();
- 1. Jak sprawdzić, czy mój bieżący wątek jest wątkiem interfejsu użytkownika?
- 2. Jak stwierdzić, czy wątek jest głównym wątkiem w C#
- 3. Jaki jest związek między wątkiem JavaScript a wątkiem interfejsu Silverlight?
- 4. iPhone: Jak ustalić, czy wątek jest głównym wątkiem?
- 5. Czy ten wątek pomocniczy html jest bezpieczny?
- 6. Czy ten wątek klasy Java jest bezpieczny?
- 7. Czy ten wątek użycia blokady jest bezpieczny?
- 8. Xcode Wątek 1: Czy zawsze jest to główny wątek interfejsu użytkownika?
- 9. W WPF jest bezpieczny wątek metody dispatcher.begininvoke interfejsu użytkownika?
- 10. sprawdzić, czy Użytkownik jest Grupa użytkownika
- 11. Czy ten wątek kodu Core Graphics jest bezpieczny?
- 12. Czy ten wątek połączenia klienta JAX-WS jest bezpieczny?
- 13. Zaktualizuj wątek interfejsu użytkownika z przenośnej biblioteki klas.
- 14. Czy wątek Netty Channel.write jest bezpieczny?
- 15. Testowanie, aby zobaczyć, czy etykieta interfejsu użytkownika jQuery jest otwarta
- 16. Jak sprawdzić, czy przycisk paska nawigacyjnego jest włączony/wyłączony w teście interfejsu użytkownika w systemie iOS?
- 17. Jak sprawdzić, czy element jest w widoku użytkownika z jquery
- 18. Jak sprawdzić, czy MethodInfo interfejsu jest metodą "nowego"
- 19. Android - SQLite ContentResolver wstawić/usunąć/zaktualizować wątek interfejsu użytkownika?
- 20. Zadanie Async z Androidem spowalnia wątek interfejsu użytkownika
- 21. Jak mogę sprawdzić, czy podana jest nazwa użytkownika?
- 22. Czy wątek RNGCryptoServiceProvider.GetBytes jest bezpieczny?
- 23. Czy wątek NSFileManager jest bezpieczny?
- 24. Jak sprawdzić, czy Java Future jest kompletna?
- 25. Jak sprawdzić, jaka jest rola aktualnego użytkownika?
- 26. Jak mogę sprawdzić, czy ten użytkownik jest anonimowy czy w rzeczywistości jest użytkownikiem mojego systemu?
- 27. Java - Jak sprawdzić, kiedy wątek czeka?
- 28. Czy C# "??" Czy wątek operatora jest bezpieczny?
- 29. Jak sprawdzić, czy wątek trzyma blokadę obiektu w C#?
- 30. Jak sprawdzić, który wątek wykonuje kod w Javie?
Dlaczego musisz wiedzieć, w jakim wątku jest uruchomiony twój kod?Jeśli jest przeznaczony do wątku UI, po prostu go tam wyślij. –
Zazwyczaj po prostu wiesz, kiedy metoda jest wykonywana w wątku interfejsu użytkownika. w każdym przypadku, w którym masz wątpliwości? – njzk2
Brak konkretnego przypadku. Po prostu sposób na mój wielowątkowy kod. – user1730789