我有一个启动的服务,在设置视图之前,某些活动必须绑定到它以获取一些数据。一切正常,但有时(很少)我得到了一个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;
}
}
嗯,它通常工作正常。但是我在做的时候有一个空指针异常:
tvName.setText(mMyService.getName());
该错误告诉tvName为空,但我不明白这怎么可能,因为它将在onCreate之后调用。此错误很少发生,但这很烦人。活动是否已销毁,但服务连接侦听器未取消?如果这是真的,如何在活动被销毁时取消该服务连接?
提前感谢!
试试这个。你失踪了
setContentView(R.layout.yourlayout);
在创建方法中,您还需要扩展到活动类希望对您有所帮助,谢谢
您忘了将setcontentView(R.layout.activity_main)
写入活动。
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setcontentView(R.layout.activity_main)
tvName = (TextView) findViewById(R.id.tv_name);
}
希望这对您有所帮助。
尝试看看如果您打开活动记录并在之后多次快速旋转手机会发生什么情况。如果您的服务连接和活动周期存在问题,您应该能够以这种方式发现它。此外,作为一种解决方法,您可以尝试获取对onServiceConnected
内 TextView 的引用并进行健全性检查。(虽然很奇怪,但我第一次听说这个,它可能与您的应用程序架构有关)。也在这里:
MyService.MyServiceBinder myServiceBinder = (MyService.MyServiceBinder)service;
mMyService = myServiceBinder();
您不应以这种方式使用服务,而应从绑定程序创建信使,并使用服务端的处理程序来执行所需的操作。