У меня есть запущенная служба, и некоторые действия должны быть привязаны к ней, чтобы получить некоторые данные, прежде чем устанавливать представления. Все работает нормально, но иногда (редко) я получал исключение 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 равно null, но я не понимаю, как это возможно, так как он будет вызываться после onCreate. Эта ошибка возникает редко, но это довольно раздражает. Может ли активность быть уничтожена, но прослушиватель подключения к службе не отменен? Если это правда, как я могу отменить это подключение к службе, когда действие уничтожено?
Заранее спасибо!
Activity
или что-то подобное, пожалуйста, не упрощайте свой код, который вы публикуете здесь. Возможно, вы создаете больше ошибок, чем у вас есть, и мы не сможем вам помочь. - person yennsarah   schedule 29.02.2016tvName
на ноль вonDestroy()
? Если вы просто добавитеif(tvName == null) //do something else, maybe restart the activity and else tvName.setText("")
, вы не получите этот сбой. - person yennsarah   schedule 29.02.2016onResume()
и отвязать его, возможно, также вonPause
, в отношении жизненного цикла активности а>. - person yennsarah   schedule 29.02.2016