服务onStartCommand抛出NullPointerException

时间:2014-04-18 06:29:37

标签: android android-intent nullpointerexception android-service

我有一个运行两个独立服务的应用。其中一个运行顺利,另一个在大多数时间没有问题,但在NullPointerException内间歇性地在大量新设备(三星,HTC,LG)上抛出onStartCommand() Android版本介于4.1和4.4.2之间。我无法在我自己的任何设备上重现错误,包括遇到此问题的两个确切模型。堆栈跟踪如下,表明问题出在第145行:

java.lang.RuntimeException: Unable to start service com.mycom.myapp.MyLocService@425ab718
with Intent { cmp=com.mycom.myapp/.MyLocService }: java.lang.NullPointerException
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2695)
at android.app.ActivityThread.access$1900(ActivityThread.java:146)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1337)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5168)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:564)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.mycom.myapp.MyLocService.onStartCommand(MyLocService.java:145)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2678)
... 10 more


我使用here提供的答案中链接的部分代码在我的应用后台运行位置服务;这是来自MyLocService.java的相关片段,其中有违规行标记为:

@Override
public void onCreate() {
    super.onCreate();

    mInProgress = false;
    mLocationRequest = LocationRequest.create();

    servicesAvailable = servicesConnected();
    mLocationClient = new LocationClient(this, this, this);
    locIntent = new Intent(MY_LOCATION);
}

public int onStartCommand (Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);      // <----- NPE AT LINE 145

    setUpLocationClientIfNeeded();

    if(!mLocationClient.isConnected() || !mLocationClient.isConnecting()) {
        mLocationClient.connect();
    }

    return START_STICKY;
}

private void setUpLocationClientIfNeeded() {
    if(mLocationClient == null) {
            mLocationClient = new LocationClient(this, this, this);
    }
}


该服务由MyActivity.java中的onCreate()内的以下代码启动:

Intent MyLocService = new Intent(this, MyLocService.class);     
startService(MyLocService);


该服务在AndroidManifest.xml中的<application>元素内声明,如下所示:

    <service
         android:name=".MyLocService"
         android:singleUser="true"
         android:stopWithTask="false" >
         <intent-filter>
             <action android:name="com.mycom.myapp.MyLocService" />
         </intent-filter>
     </service>


我一直无法确定导致此异常的原因,因为它不会一直发生,我自己也无法重现。什么可能导致这种间歇性问题?

1 个答案:

答案 0 :(得分:1)

似乎返回START_REDELIVER_INTENT而非START_STICKY已解决此问题。我没有继续弄清楚如何检查一个空的意图,而是找到了一种据说不会首先引起它的方法。

我将更新我发现的有关此方法的任何进一步结论,因为它会被我的用户更广泛地实施。