我有一个启动的服务,一些活动必须绑定到它才能在设置视图之前获取一些数据。一切工作正常,但一些(很少)时间,我得到了一个NullPointerException。我的简化活动是:服务异常NullPointerException
public class MyActivity extends Activity {
TextView tvName;
boolean mIsMyServiceBound;
MyService mMyService;
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
MyService.MyServiceBinder myServiceBinder = (MyService.MyServiceBinder) service;
mMyService = myServiceBinder();
mIsMyServiceBound = true;
// Set up views
tvName.setText(mMyService.getName());
}
@Override
public void onServiceDisconnected(ComponentName className) {
mIsMyServiceBound = false;
mMyService = null;
}
};
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.yourlayout);
tvName = (TextView) findViewById(R.id.tv_name);
...
}
@Override
protected void onStart() {
super.onStart();
// Bind to LocalService
Intent intent = new Intent(this, ChatService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
mIsChatServiceBound = true;
}
@Override
protected void onStop() {
super.onStop();
// Unbind from the service
if (mIsChatServiceBound) {
unbindService(mConnection);
mIsChatServiceBound = false;
}
}
@Override
public void onDestroy() {
super.onDestroy();
tvName = null;
}
}
那么,它通常工作正常。但这样做,当我有一个NullPointerException:
tvName.setText(mMyService.getName());
错误告诉tvName是空的,但我不明白这怎么可能,因为它的onCreate后调用。这个错误很少发生,但这很烦人。可能该活动已被销毁,但服务连接侦听器未取消?如果这是真的,当活动被破坏时我怎么能取消那个服务连接?
在此先感谢!
你没有扩展'活动'或类似的东西,请不要过分简化你在这里发布的代码。您可能会创造比您更多的错误,我们无法为您提供帮助。 – yennsarah
我编辑了代码,我忘了写它。对不便,我已经更新了代码。 – FVod
为什么你在'onDestroy()'中设置'tvName'为null?如果你简单地添加一个if(tvName == null)//做一些其他的事情,也许重新开始这个活动,否则tvName.setText(“”)',你不会得到这个崩溃。 – yennsarah