2013-09-06 19 views
5

Czy onReceive() metoda zabezpieczania wątków jest bezpieczna, czy też muszę sam przeprowadzić synchronizację?BroadcastReceiver onReceive() wątek bezpieczny?

Jeśli mam dowolną zmienną na poziomie klasy, która jest używana wewnątrz metody onReceive(), a metoda onReceive() jest wywoływana wiele razy bardzo szybko, czy spowoduje to problem?

public class MyBroadCastReceiver extends BroadcastReceiver { 

    boolean isFirstTrigger = true; 

    @Override 
    public void onReceive(Context context, Intent arg1) { 
     if(isFirstTrigger) 
     { 
     //Do something time consuming 
     isFirstTrigger = false; 
     } 
     } 

Odpowiedz

7

jest() metoda onReceive z BroadcastReceiver wątku bezpieczne czy muszę wdrożyć synchronizacji na własną rękę?

Będzie on wywoływany tylko w głównym wątku aplikacji. W związku z tym jest wątkowo bezpieczny w odniesieniu do wszystkich innych uruchomionych na głównym wątku aplikacji.

Jeśli mam żadnych zmienną poziomu klasy, który jest używany wewnątrz metody onReceive(), a metoda onReceive() jest wywoływana wiele razy bardzo szybko, spowodowałoby to problem?

Jeśli w manifeście jest zarejestrowany BroadcastReceiver, dla każdej emisji tworzone jest nowe wystąpienie. Właśnie dlatego zwykle nie widzisz elementów danych na BroadcastReceiver.

+0

Program BroadcastReceiver jest zarejestrowany w manifeście i muszę rozwiązać problem, w którym transmisja zmiany sieci jest uruchamiana dwukrotnie lub trzykrotnie na niektórych urządzeniach. Myślałem o używaniu zmiennej poziomu klasy. Teraz myślę o użyciu SharedPreferences i przechowywanie tam "isFirstTrigger", a następnie ustawienie go false po zakończeniu przetwarzania. Ale nie wiem, czy to zadziała, czy nie (na wypadek, gdyby nowe instancje zostały utworzone i wywołane przed zakończeniem pierwszego połączenia). Jakieś sugestie? – Manish

+0

@Manish: Twój proces * prawdopodobnie * pozostanie w pobliżu przez kilka sekund po emisji, więc możesz być w stanie uciec statycznym członkiem danych. W przeciwnym razie będziesz musiał go zachować, czy to w 'SharedPreferences' czy gdzie indziej. – CommonsWare

+0

Dzięki @CommonsWare, mój niepokój przy użyciu SharedPreferences jest: Jeśli tworzonych jest wiele instancji BroadcastReceivers, czy nie wszystkie one miałyby dostęp do SharedPreference w tym samym czasie? Może się zdarzyć, że drugie i trzecie wywołanie onRecieve() nastąpi przed pierwszym wywołaniem aktualizacji SharedPreference. – Manish

Powiązane problemy