У меня есть начатый сервис, и некоторые действия должны привязываться к нему, чтобы получить некоторые данные перед установкой представлений. Все работает нормально, но в некоторых (редко) случаях я получил исключение NullPointerException. Моя упрощенная деятельность:Strange 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
Почему вы задали свой 'tvName' null в' onDestroy() '? Если вы просто добавите 'if (tvName == null) // сделайте что-то еще, возможно перезапустите действие, а tvName.setText (" ")', вы не получите этот сбой. – yennsarah