2012-10-12 13 views
21

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

+1

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. –

+0

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

+0

Brak konkretnego przypadku. Po prostu sposób na mój wielowątkowy kod. – user1730789

Odpowiedz

39
  1. Odpowiedź pożyczone stąd: How to check if current thread is not main thread

    Looper.myLooper() == Looper.getMainLooper()

  2. 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();

  3. 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.

0

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ć.
-1

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.

8

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(); 
Powiązane problemy