Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NullPointerException when using LocalBroadcastManager

I'm trying to use LocalBroadcastManager with my custom intents. It seems that it's very picky about intents and If I send the intent this way:

In Myintents.java I declare

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

Later on in the broadcast sender I do:

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

Then I'm getting this exception:

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)

However If I use an explicit string

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

Everything works fine.

What's wrong? Why can't I define the intent name in another class?

like image 909
ApriOri Avatar asked May 04 '13 23:05

ApriOri


2 Answers

I just came across this. The NPE is a result of the registered listener (read: receiver) for the event you are firing (MyIntents.LOCATION_UPDATE) not having been instantiated by the component hosting it.

Check that the thing you want to respond to this broadcast has actually been instantiated at the right point (probably the hosting activity/fragment).

like image 157
BrantApps Avatar answered Nov 13 '22 08:11

BrantApps


In my case, (I had the same error) I forgot to create an instance of my class that extends the BroadcastReceiver. (and overrides the onReceive() method)

    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();
    }
}

Passing an empty reference of this class to the LocalBroadcastManager with:

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

wasn't a problem until it tries to invoke the onReceive() method of the class. What I forgot was:

m_MeasurementUpdateReceiver = new MeasurementUpdateReceiver();

I hope this helps other people facing this error.

like image 29
JaKe Avatar answered Nov 13 '22 10:11

JaKe