将位置更新代码移至onCreate后触发空指针异常求助
解决空指针异常:Service未绑定就调用方法的问题
嘿,我一眼就看出问题出在哪了——你把mService.requestLocationUpdates()移到onCreate末尾后触发空指针,核心原因是服务还没完成绑定,mService此时还是null!
为什么之前按钮点击没问题?
之前的按钮点击逻辑是在权限校验通过后才设置的,而且此时已经调用了bindService。等用户点击按钮时,ServiceConnection的onServiceConnected方法基本已经执行完毕,mService已经被正确初始化。但你现在直接在onCreate里调用,这时候权限校验是异步操作,bindService甚至都还没执行,mService自然还是空的。
靠谱的解决方案
你需要确保服务绑定成功后再启动位置更新,推荐用下面这个方案:
方案一:在服务绑定完成时自动触发更新
修改你的ServiceConnection实现,把启动更新的逻辑放到onServiceConnected方法里:
private final ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder iBinder) { MyBackgroundService.LocalBinder binder = (MyBackgroundService.LocalBinder) iBinder; mService = binder.getService(); mBound = true; // 服务绑定成功后自动启动位置更新,加判断避免重复启动 if (!Common.requestingLocationUpdates(UserLocation.this)) { mService.requestLocationUpdates(); } } @Override public void onServiceDisconnected(ComponentName name) { mService = null; mBound = false; } };
然后记得删除onCreate末尾那行mService.requestLocationUpdates();代码。
额外的安全防护
为了避免其他场景下的空指针,建议在所有调用mService方法的地方都加个非空判断,比如按钮点击事件:
requestLocation.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mService != null && mBound) { mService.requestLocationUpdates(); } } }); removeLocation.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mService != null && mBound) { mService.removeLocationUpdates(); } } });
这样就能彻底解决空指针问题,同时保证逻辑的可靠性。
内容的提问来源于stack exchange,提问作者Pitchai Mari
相关产品推荐
相关产品推荐

