0

У меня есть начатый сервис, и некоторые действия должны привязываться к нему, чтобы получить некоторые данные перед установкой представлений. Все работает нормально, но в некоторых (редко) случаях я получил исключение 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. Эта ошибка случается редко, но это довольно раздражает. Может ли деятельность была уничтожена, но слушатель службы связи не был отменен? Если это так, как я могу отменить это соединение службы при уничтожении активности?

Заранее благодарен!

+1

Вы не распространяете «действие» или что-то похожее, пожалуйста, не упрощайте свой код, который вы публикуете здесь. Вы можете создавать больше ошибок, чем есть, и мы не можем вам помочь. – yennsarah

+0

Я редактировал код, я тоже забыл написать его. Извините за неудобства, теперь я обновил код. – FVod

+0

Почему вы задали свой 'tvName' null в' onDestroy() '? Если вы просто добавите 'if (tvName == null) // сделайте что-то еще, возможно перезапустите действие, а tvName.setText (" ")', вы не получите этот сбой. – yennsarah

ответ

0

Попробуйте это. У вас не хватает

setContentView(R.layout.yourlayout); 

в OnCreate Method.You должны распространяться на класс активность слишком Надеюсь, что это helps.thanks

+0

Спасибо, я забыл написать это на моем упрощенном примере. Извините, я отредактировал его сейчас, потому что setcontentView находится в моем реальном коде, иначе он всегда сбой. Спасибо за ваш ответ, есть ли у вас какие-либо сведения о том, что может произойти? – FVod

0

Вы забыли написать 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); 
} 

Надеюсь, это вам поможет.

+0

Спасибо, я забыл написать это на моем упрощенном примере. Извините, я отредактировал его сейчас, потому что setcontentView находится в моем реальном коде, иначе он всегда сбой. Спасибо за ваш ответ, есть ли у вас какие-либо сведения о том, что может произойти? – FVod

+0

@FVod, убедитесь, что у вас есть textview с идентификатором tv_name в вашем макете –

+0

Да, он присутствует. На самом деле эта ошибка редко случается редко.Вот почему я думаю, что здесь что-то странное, что-то вроде уничтожения активности, пока прослушиватель сервисных соединений еще не был запущен. Как вы думаете? – FVod

0

Постарайтесь узнать, что произойдет, если вы откроете свою активность и быстро поменяете свой телефон много раз. Если есть проблемы с вашим подключением к службе и циклом активности, вы должны быть в состоянии обнаружить ее таким образом. Также в качестве обходного пути вы можете попытаться получить ссылку на TextView внутри onServiceConnected и сделать проверку работоспособности. (Очень странно, но в первый раз, когда я слышу об этом, это может быть связано с вашей архитектурой приложения). Также здесь:

MyService.MyServiceBinder myServiceBinder = (MyService.MyServiceBinder)service; mMyService = myServiceBinder();

Вы не должны использовать сервис таким образом, вместо того, чтобы создать Посланник из подшивки и использовать обработчик на стороне службы для выполнения требуемых операций.