1

私はこの問題を長い間理解しようとしてきたので、皆さんが助けてくれることを願っています. ボタンのクリックから IntentService を実行していますが、null ポインター例外が発生しています。これが私のコードです:

主な活動:

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

ログ ファイル:

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

私のAndroid Manifest.xmlで

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

1 に答える 1

2

問題は、XmlIntentService コンストラクターの次の行です。

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

IntentService が構築されているとき (具体的には、attach(...) が呼び出される前)、親 Service の mBase メンバー変数は null です。getApplicationContext への呼び出しは、親の Service クラスで mBase を逆参照しようとしているため、NullReferenceException が発生します。

解決策は、XmlIntentService コンストラクターから Toast.makeText 行を削除することです。

于 2012-11-09T05:36:06.787 に答える