2010-08-26 18 views
14

Nie rozumiem, dlaczego otrzymuję ten wyjątek po naciśnięciu przycisku wstecz. Mam IntentReceiver zarejestrowany w metodzie onCreate i powinien zostać wyrejestrowany w metodzie onPause. Wywołanie funkcji My Log.w() w metodzie onPause prowadzi mnie do przekonania, że ​​wywoływana jest metoda unregisterReceiver(), ale otrzymuję ten wyjątek.Android: Wyrzucany wyjątek IntentReceiver wyrzucany, mimo że wywoływam unregisterReceiver

Jakieś myśli?

private PlayerReceiver playerReceiver; 

public void onCreate(Bundle savedInstanceState) { 
... 
    IntentFilter playerFilter;  
    playerReceiver = new PlayerReceiver(); 
    playerFilter = new IntentFilter(PlayerService.BUFFERING_FAILURE); 
    playerFilter.addAction(PlayerService.BUFFERING_SUCCESS); 
    registerReceiver(playerReceiver, playerFilter); 
... 
} 

protected void onPause() { 
... 
    if (playerReceiver != null){ 
     unregisterReceiver(playerReceiver); 
     Log.w(TAG, "playerReceiver has been unregistered"); 
     playerReceiver = null; 
    } 
... 
} 

public class PlayerReceiver extends BroadcastReceiver { 

    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(PlayerService.BUFFERING_FAILURE)){ 
      setListenButton(false); 
     } 
     closePlayDialog(); 
    } 
} 

LogCat Wyjście

08-26 11:44:28.646: WARN/WWOZMain(1058): playerReceiver has been unregistered  
08-26 11:44:29.476: ERROR/ActivityThread(1058): Activity org.wwoz.WWOZMain has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()?  
08-26 11:44:29.476: ERROR/ActivityThread(1058): android.app.IntentReceiverLeaked: Activity org.wwoz.WWOZMain has leaked IntentReceiver [email protected] that was original 

ly tu zarejestrowany. Czy brakuje połączenia z wyrejestrowaniemReceiver()?

+4

Generalnie powinieneś zarejestrować się w 'onResume' i wyrejestrować w' onPause' (lub 'onStart' i' onStop'). Możliwe, że wielokrotnie rejestrujesz się bez ponownej rejestracji po wznowieniu aktywności. Co wydaje się być przeciwieństwem problemu, który masz, ale wydaje mi się, że może nadal wywoływać to ostrzeżenie? –

+0

Argh! Dzięki Christopher. Nie zwracałem nawet uwagi na to, że rejestrowałem odbiornik zarówno w "onCreate", jak i 'onResume'. Zamiast tego zarejestrowałem się dwa razy i tylko raz wyrejestrowałem. Doh! –

Odpowiedz

20

To jest problem dotyczący cyklu życia Androida. Widzę to w głównej działalności, a następnie testuję urządzenie za pomocą przycisku wstecz, który powraca do ekranu powitalnego.

W metodzie onPause().

wyrejestrować BroadcastReceiver utworzonego w onCreate()

W onRestart() ponownie zarejestrować się nowy Broadcast Receiver.

W klasie aktywności należy prowadzić rejestr odbiornika Broadcast jako elementu danych instancji.

DRUGI

myślę to również kwestia wzmacniania funkcji z Androidem.

Czasami programista potrzebuje odbiornika, aby przeżył aktywność. Na przykład, aby zrozumieć, kiedy niektóre stany ekranu są dostępne, czy nie. Pomyśl o kontekście konwersacji modelu przepływu pracy, który ma wiele stanów.

TRZECI

można zarejestrować i wyrejestrować odbiorników o aktywności, ale proste wywołanie jak isRegistered(BroadcastReceiver) w klasie aktywny może być bardzo przydatna.

Jeśli potrzebujesz odbiorników, aby żyć poza aktywnością, to nie odpowiadam, z wyjątkiem uciszenia ostrzeżenia, przez dodanie unregister(X) w rozmowie . YMMV ;-)

8

Miałem dokładnie ten sam problem. Powód był taki, że nieumyślnie zarejestrowałem dwa razy ten sam program BroadcastReceiver.

3

Moja sytuacja była podobna w przypadku Mullinsa, zarejestrowałem odbiornik zarówno w klasie, jak i jej podklasie.

Dla początkujących, takich jak ja, po prostu przełącz punkt przerwania na swój receiver, a następnie debuguj aplikację. Jeśli odbiornik jest podobny do [email protected], podczas gdy logi błędów w logcat jest inny od niego, na przykład [email protected], ze znakami po "@" różne, na pewno zarejestrowałeś je dwa razy (lub więcej).

(Powyżej podoba mi się komentarz pod odpowiedzią Mullinsa, w rzeczywistości, zamieszczam go tutaj, ponieważ nie mogę teraz publikować komentarzy.)

Powiązane problemy