【问题标题】:Passing extras from Activity to Intent throws NullPointerException将额外内容从 Activity 传递到 Intent 会引发 NullPointerException
【发布时间】:2015-05-26 17:25:39
【问题描述】:

这是一个衍生出另一个问题的问题。

我将两个字符串从我的主要活动传递给一个子服务,这很好,但是当主要活动终止时,该服务会抛出 NullPointerException 试图获取这两个字符串。

来自 MainActivity:

Intent i = new Intent(this, PebbleService.class);
i.putExtra("quote", quote[0]);
i.putExtra("author", quote[1]);
startService(i);

来自 PebbleService:

public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);

    final String author = intent.getStringExtra("author");
    final String quote = intent.getStringExtra("quote");

    // Define AppMessage behavior
    if (appMessageReciever == null) {
        appMessageReciever = new PebbleKit.PebbleDataReceiver(WATCHAPP_UUID) {

            @Override
            public void receiveData(Context context, int transactionId, PebbleDictionary data) {
                // Always ACK
                PebbleKit.sendAckToPebble(context, transactionId);

                // Send KEY_QUOTE to Pebble
                PebbleDictionary out = new PebbleDictionary();
                out.addString(KEY_QUOTE, quote);
                out.addString(KEY_AUTHOR, author);
                PebbleKit.sendDataToPebble(getApplicationContext(), WATCHAPP_UUID, out);
            }
        };

        // Add AppMessage capabilities
        PebbleKit.registerReceivedDataHandler(this, appMessageReciever);
    }

    return START_STICKY;
}

来自 Logcat 的错误:

05-26 10:29:52.972    4147-4147/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: net.thevgc.quotes, PID: 4147
    java.lang.RuntimeException: Unable to start service net.thevgc.quotes.PebbleService@423eb138 with null: java.lang.NullPointerException
            at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2732)
            at android.app.ActivityThread.access$2100(ActivityThread.java:139)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1307)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5086)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at net.thevgc.quotes.PebbleService.onStartCommand(PebbleService.java:34)
            at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2715)
            at android.app.ActivityThread.access$2100(ActivityThread.java:139)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1307)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5086)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 你能发布错误吗?
  • @Simas 说完了。
  • final string author...

标签: java android android-intent android-service


【解决方案1】:

根据documentation

intent - ... 如果服务正在重新启动,这可能为 null

因此检查null意图:

public int onStartCommand(Intent intent, int flags, int startId) {
    int cmd = super.onStartCommand(intent, flags, startId);

    if (intent == null) return cmd;

    final String author = intent.getStringExtra("author");
    final String quote = intent.getStringExtra("quote");

    ...
}

【讨论】:

  • 所以这解决了 NPE,这在技术上是正确的说法。但这也意味着当主应用程序未运行时,我无权访问这些字符串。
  • @DarkWolffe 您是否希望在您的应用未运行时调用您的服务?如果是这样,它不应该依赖于传递给它的字符串..
  • 这是问题的一部分:服务的重点是能够传递从应用程序的类收集的数据并将其传递给 Pebble,而不管应用程序的状态如何(作为应用程序必须以某种方式运行 Pebble 应用程序才能从中收集数据)。
  • @DarkWolffe 听起来您的应用程序应该将数据保存在首选项或 SQLite 数据库中,并且服务会获取它。您不能像以前那样访问类(随机实例化 MainActivity)或当前,因为在应用未运行时,任何人都不会将字符串发送给您。
  • @DarkWolffe 如果您只需要几个字符串,首选项将绰绰有余,只需几行代码即可。无论如何,祝你好运!
猜你喜欢
  • 1970-01-01
  • 2020-05-30
  • 2013-08-04
  • 1970-01-01
  • 2011-03-18
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多