2013-05-04 22 views
9

Sto tentando di utilizzare LocalBroadcastManager con i miei intenti personalizzati. Sembra che è molto esigenti in fatto di intenti e se io mando l'intento in questo modo:NullPointerException quando si utilizza LocalBroadcastManager

In Myintents.java dichiaro

public static final String LOCATION_UPDATE = "com.example.myapp.location_update"; 

Più tardi nella mittente trasmissione che faccio:

Intent intent = new Intent(MyIntents.LOCATION_UPDATE); 
localBroadcastManager.sendBroadcast(intent); 

Poi sto ottenendo questa eccezione:

05-05 02:23:29.914: E/AndroidRuntime(6952): FATAL EXCEPTION: main 
05-05 02:23:29.914: E/AndroidRuntime(6952): java.lang.NullPointerException 
05-05 02:23:29.914: E/AndroidRuntime(6952): at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:297) 
05-05 02:23:29.914: E/AndroidRuntime(6952): at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46) 
05-05 02:23:29.914: E/AndroidRuntime(6952): at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:116) 
05-05 02:23:29.914: E/AndroidRuntime(6952): at android.os.Handler.dispatchMessage(Handler.java:99) 

Tuttavia Se uso un expl icit string

Intent intent = new Intent("my-intent"); 

Tutto funziona correttamente.

Cosa c'è che non va? Perché non riesco a definire il nome dell'intento in un'altra classe?

+1

public static final String "LOCATION_UPDATE = (citazione prima LOCATION_UPDATE), in modo che un errore di battitura? – Sudhee

+0

qual è il contenuto di "LocalBroadcastManager.java:297" – k3b

+0

No, non è che errore di battitura .. LocalBroadcastManager è parte del quadro Android. – ApriOri

risposta

17

Mi sono appena imbattuto in questo. L'NPE è il risultato del listener registrato (leggi: destinatario) per l'evento che si sta attivando (MyIntents.LOCATION_UPDATE) non è stato istanziato dal componente che lo ospita.

Verificare che la cosa che si desidera rispondere a questa trasmissione sia stata effettivamente istanziata al punto giusto (probabilmente l'attività/frammento di hosting).

+0

Quindi, come spieghi il problema della stringa esplicita? Non ho capito perché cambiare la stringa inline in una variabile stringa statica finale fa alcuna differenza – ApriOri

+0

Sospetto che sia dovuto al fatto che l'intenzione [azione] (http://developer.android.com/reference/android/content/Intent.html#Intent (java.lang.String)) è stata modificata da qualcosa quale altro ricevitore si è registrato nel suo filtro intent (cioè viene chiamato quando viene trasmessa quell'azione) a così mething arbitrario ("my-intent" piuttosto che "com.example.myapp.location_update"). Il LocalBroadcastManager non ha rilevato nessun ascoltatore registrato per aver ricevuto azioni "mio-intent", quindi non è successo nulla. – OceanLife

+0

Puoi vedere questo in AOSP [qui] (https://code.google.com/p/moloko/source/browse/libs/ActionBarSherlock/src/android/support/v4/content/LocalBroadcastManager.java?r=538 # 297) – OceanLife

12

Nel mio caso, (ho avuto lo stesso errore) ho dimenticato di creare un'istanza della mia classe che estende BroadcastReceiver. (E sostituisce il metodo OnReceive())

private MeasurementUpdateReceiver m_MeasurementUpdateReceiver; 

// Listens to local broadcasts done by the MeasurementService 
private class MeasurementUpdateReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // Intent already filtered by the LocalBroadcastManager in onResume() 
     String data = intent.getStringExtra("data")); 
     Toast.makeText(getApplicationContext(), "Received data " + data, Toast.LENGTH_LONG).show(); 
    } 
} 

passando un riferimento vuoto di questa classe al LocalBroadcastManager con:

LocalBroadcastManager.getInstance(this).registerReceiver(m_MeasurementUpdateReceiver, new IntentFilter("measurementupdate")); 

non era un problema finché non tenta di richiamare l'OnReceive (metodo) della classe. Quello che ho dimenticato è stato:

m_MeasurementUpdateReceiver = new MeasurementUpdateReceiver(); 

Spero che questo aiuti altre persone di fronte a questo errore.

+0

Ho creato il ricevitore in onCreate (di un frammento) e registrato il ricevitore in onAttach. Hai ottenuto questo errore, quindi assicurati di creare il ricevente nello stesso posto. – Gober

Problemi correlati