(Android)service抛出NullException ,导致系统崩溃
service是这样的
public class GetUserInfoService extends Service {
private Context context;
private List<User> tempList;
private Boolean progress = false;
public void startAsyncTask(Context context, List<User> tempList) {
new DoUpdateUserTask(context, new GetUnGetDataHandler(), null)
.exe(tempList);
}
@Override
public void onCreate() {
super.onCreate();
}
@SuppressWarnings("unchecked")
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (null != intent) {
tempList = (List<User>) intent.getSerializableExtra("reqList");
startAsyncTask(getApplicationContext(), tempList);
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
public class MsgBinder extends Binder {
public GetUserInfoService getService() {
return GetUserInfoService.this;
}
}
public class GetUnGetDataHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case Constant.REQUEST_SUCCESS:
progress = true;
List<User> saveList = (List<User>) msg.obj;
new UserDao(context).saveUserInfoList(saveList);
InstHXSDKHelper.displayNotifier();
break;
default:
break;
}
}
}
}
崩溃日志是这样的:
java.lang.RuntimeException: Unable to start service **com.jiuqi.kzwlg.driverclient.chat.service.GetUserInfoService@4241ec80 with null: java.lang.NullPointerException**
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2728)
at android.app.ActivityThread.access$2100(ActivityThread.java:147)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1306)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5133)
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:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.jiuqi.kzwlg.driverclient.chat.service.GetUserInfoService.onStartCommand(GetUserInfoService.java:45)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2711)
... 10 more
java.lang.NullPointerException
at com.jiuqi.kzwlg.driverclient.chat.service.GetUserInfoService.onStartCommand(GetUserInfoService.java:45)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2711)
at android.app.ActivityThread.access$2100(ActivityThread.java:147)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1306)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5133)
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:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
at dalvik.system.NativeStart.main(Native Method)
原因:
intent的参数是null,原因是这个intent参数是通过startService(Intent)方法所传递过来的,但是如果Service在你的进程退出后有可能被系统自动重启,这个时候intent就会是null.
解决方法:
所以在使用intent前需要判断一下是否为空。
还有另外一种解决方法:
如果实现 onStartCommand去调度异步工作或者其他的线程,有必要设置START_FLAG_REDELIVERY让系统重发intent到service以便service被killed后不会丢失intent数据。
关于service在后头怎样被干掉又被系统重启,建议深入学习一下service
可以参考这篇文章: