Troy Loberger
Troy Loberger

Reputation: 347

Starting an IntentService errors out on button click

I've been trying to figure out this problem for far to long so hopefully you guys can help. I am running an IntentService off of a button click and I'm getting a null pointer exception. Here is my code:

MainActivity:

public class MainActivity extends Activity {

    private ResponseReceiver receiver;
    private Button getButton;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        IntentFilter filter = new IntentFilter(ResponseReceiver.ACTION_RESP);
        filter.addCategory(Intent.CATEGORY_DEFAULT);
        receiver = new ResponseReceiver();
        registerReceiver(receiver, filter);

        getButton = (Button) findViewById(R.id.button1);
        setGetButtonOnClickListener();
    }

    public void setGetButtonOnClickListener()
    {
        getButton.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View  v)
            {
                Intent msgIntent = new Intent(getApplicationContext(), XMLIntentService.class);
                msgIntent.putExtra(XMLIntentService.PARAM_IN_MSG, "test");
                startService(msgIntent);
                Toast.makeText(getApplicationContext(), "intent started" , Toast.LENGTH_SHORT).show();
            }
        });
    }

    public class ResponseReceiver extends BroadcastReceiver {
       public static final String ACTION_RESP = "com.example.intent.action.MESSAGE_PROCESSED";
       @Override
        public void onReceive(Context context, Intent intent) {
           String information = intent.getStringExtra(XMLIntentService.PARAM_OUT_MSG);
           information += " yay!";
          Toast.makeText(getApplicationContext(), information , Toast.LENGTH_SHORT).show();
       }
    }
}

XMLIntentService

public class XMLIntentService extends IntentService {
    public static final String PARAM_IN_MSG = "omsg";
    public static final String PARAM_OUT_MSG = "omsg";

    public XMLIntentService() {
        super("XMLIntentService");
        Toast.makeText(getApplicationContext(), "Intent Service Called" , Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Toast.makeText(getApplicationContext(), "On handle intent called" , Toast.LENGTH_SHORT).show();
        String msg = intent.getStringExtra(PARAM_IN_MSG);

        //Get XML info here
        String resultTxt = "Yayy";
        Log.v("XMLIntentService", "Handling msg: " + resultTxt);

        Intent broadcastIntent = new Intent();
        broadcastIntent.setAction(ResponseReceiver.ACTION_RESP);
        broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
        broadcastIntent.putExtra(PARAM_OUT_MSG, resultTxt);
        sendBroadcast(broadcastIntent);
    }
}

Log File:

11-08 23:06:31.130: E/Trace(1304): error opening trace file: No such file or directory (2)
11-08 23:06:31.902: D/gralloc_goldfish(1304): Emulator without GPU emulation detected.
11-08 23:06:39.922: D/AndroidRuntime(1304): Shutting down VM
11-08 23:06:39.922: W/dalvikvm(1304): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
11-08 23:06:39.951: E/AndroidRuntime(1304): FATAL EXCEPTION: main
11-08 23:06:39.951: E/AndroidRuntime(1304): java.lang.RuntimeException: Unable to instantiate service com.example.cis345lab5.XMLIntentService: java.lang.NullPointerException
11-08 23:06:39.951: E/AndroidRuntime(1304):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2347)
11-08 23:06:39.951: E/AndroidRuntime(1304):     at android.app.ActivityThread.access$1600(ActivityThread.java:130)
11-08 23:06:39.951: E/AndroidRuntime(1304):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1277)
11-08 23:06:39.951: E/AndroidRuntime(1304):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-08 23:06:39.951: E/AndroidRuntime(1304):     at android.os.Looper.loop(Looper.java:137)
11-08 23:06:39.951: E/AndroidRuntime(1304):     at android.app.ActivityThread.main(ActivityThread.java:4745)
11-08 23:06:39.951: E/AndroidRuntime(1304):     at java.lang.reflect.Method.invokeNative(Native Method)
11-08 23:06:39.951: E/AndroidRuntime(1304):     at java.lang.reflect.Method.invoke(Method.java:511)
11-08 23:06:39.951: E/AndroidRuntime(1304):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-08 23:06:39.951: E/AndroidRuntime(1304):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-08 23:06:39.951: E/AndroidRuntime(1304):     at dalvik.system.NativeStart.main(Native Method)
11-08 23:06:39.951: E/AndroidRuntime(1304): Caused by: java.lang.NullPointerException
11-08 23:06:39.951: E/AndroidRuntime(1304):     at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:101)
11-08 23:06:39.951: E/AndroidRuntime(1304):     at com.example.cis345lab5.XMLIntentService.<init>(XMLIntentService.java:16)
11-08 23:06:39.951: E/AndroidRuntime(1304):     at java.lang.Class.newInstanceImpl(Native Method)
11-08 23:06:39.951: E/AndroidRuntime(1304):     at java.lang.Class.newInstance(Class.java:1319)
11-08 23:06:39.951: E/AndroidRuntime(1304):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2344)
11-08 23:06:39.951: E/AndroidRuntime(1304):     ... 10 more

In my Android Manifest.xml

<service android:enabled="true"
            android:name=".XMLIntentService"></service>

Upvotes: 1

Views: 709

Answers (1)

PacificSky
PacificSky

Reputation: 3500

The issue is this line in the XmlIntentService constructor:

Toast.makeText(getApplicationContext(), "Intent Service Called" , Toast.LENGTH_SHORT).show();

When the IntentService is being constructed (specifically, before attach(...) is called), the mBase member variable in the parent Service is null. The call to getApplicationContext is trying to dereference mBase in the parent Service class, resulting in a NullReferenceException.

The solution is to remove the Toast.makeText line from the XmlIntentService constructor.

Upvotes: 2

Related Questions