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;
}
}
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
@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
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