2010-08-26 14 views
14

Non capisco perché ottengo questa eccezione quando si preme il pulsante Indietro. Ho IntentReceiver registrato nel metodo onCreate e dovrebbe essere non registrato nel metodo onPause. La mia chiamata Log.w() all'interno del metodo onPause mi porta a credere che venga chiamato il metodo unregisterReceiver(), ma sto ottenendo ancora questa eccezione.Android: È stata generata un'eccezione Leaked IntentReceiver anche se io chiamo unregisterReceiver

Qualche idea?

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 uscita

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 registrati qui. Ti manca una chiamata a unregisterReceiver()?

+4

In genere è necessario registrarsi in "onResume" e annullare la registrazione in "onPause" (o "onStart" e "onStop"). Quindi è possibile che tu stia annullando la registrazione più volte senza una nuova registrazione quando l'attività riprende. Quale sembra l'opposto del problema che stai avendo, ma suppongo che potrebbe comunque attivare lo stesso avviso di registro? –

+0

Argh! Grazie Christopher. Non ho nemmeno prestato attenzione al fatto che stavo registrando il ricevitore sia in "onCreate" che in "onResume". Così, invece, mi sono registrato due volte e ho annullato la registrazione una sola volta. Doh! –

risposta

20

Questo è un problema del ciclo di vita delle attività Android. Lo vedo in un'attività principale e poi eseguo il test sul dispositivo con il pulsante Indietro che torna a una schermata iniziale.

Nel metodo onPause().

Annullare la registrazione del BroadcastReceiver che si è creato nel onCreate()

Nel onRestart() registrare nuovamente un nuovo ricevitore broadcast.

Nella classe di attività è necessario conservare un record del destinatario di trasmissione come membro dati di istanza.

SECONDO

penso che anche questo un problema di funzione di miglioramento con Android.

A volte gli sviluppatori necessitano di un ricevitore broadcast per sopravvivere all'attività. Ad esempio, per capire quando determinati stati dello schermo sono disponibili o meno. Pensa a un contesto di conversazione del modello di flusso di lavoro, che ha molti stati.

TERZO

È possibile registrare e annullare la registrazione riceventi per la radiodiffusione con un'attività, ma una chiamata semplice come isRegistered(BroadcastReceiver) nella classe di attività potrebbe essere molto utile.

Se si desidera che i ricevitori vivano oltre l'attività, non rispondere, ad eccezione di disattivare l'avviso, aggiungendo unregister(X) nella chiamata onDestroy(). YMMV ;-)

8

Ho avuto lo stesso identico problema. La causa era che inavvertitamente avevo registrato lo stesso BroadcastReceiver due volte.

3

La mia situazione era simile a quella di Mullins, ho registrato un ricevitore sia in una classe che nella sua sottoclasse.

Per i neofiti come me, basta attivare un punto di interruzione su receiver, quindi eseguire il debug dell'applicazione. Se il ricevitore è qualcosa come [email protected], mentre il log degli errori in logcat è diverso da esso, come ad esempio [email protected], con caratteri dopo "@" diversi, sicuramente lo hai registrato due volte (o più).

(In alto piace un commento sotto la risposta di Mullins, in realtà, lo post qui perché non posso pubblicare commenti ora.

Problemi correlati