我有一个运行两个独立服务的应用。其中一个运行顺利,另一个在大多数时间没有问题,但在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>
我一直无法确定导致此异常的原因,因为它不会一直发生,我自己也无法重现。什么可能导致这种间歇性问题?
答案 0 :(得分:1)
似乎返回START_REDELIVER_INTENT
而非START_STICKY
已解决此问题。我没有继续弄清楚如何检查一个空的意图,而是找到了一种据说不会首先引起它的方法。
我将更新我发现的有关此方法的任何进一步结论,因为它会被我的用户更广泛地实施。