2015-06-16 4 views
2

У меня ошибка, когда я регистрирую широковещательный приемник в конструкторе. Однако, когда я регистрирую его в , он выдает исключение из-за отсутствия регистрации. Как это может быть и вы можете помочь мне решить проблему.Радиовещательный приемник не зарегистрирован

Основная проблема заключается в том, что я связан с классом NetworkService, от которого я также не могу отвязать. Это вызывает проблемы, когда я перезапускаю приложение и говорю, что у меня есть «утечка». Но я не знаю, какая из двух проблем порождает утечку.

Вот мой код:

Константы

private static NetworkService networkService; 
private ServiceConnection networkServiceConnection; 
private BroadcastReceiver networkServiceMessageReceiver; 
private boolean boundToService; 

OnCreate

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_splash); 

    /** Defines callbacks for service binding, passed to bindService() */ 
    networkServiceConnection = new ServiceConnection() { 
     @Override 
     public void onServiceConnected(ComponentName componentName, IBinder service) { 
      NetworkService.LocalBinder binder = (NetworkService.LocalBinder) service; 
      networkService = binder.getService(); 
      boundToService = true; 

      LocalBroadcastManager.getInstance(SplashActivity.this).registerReceiver(networkServiceMessageReceiver, new IntentFilter(NetworkService.CHECK_FOR_UPDATE_RESULT)); 
      checkForUpdate(); 
     } 

     @Override 
     public void onServiceDisconnected(ComponentName componentName) { 
      boundToService = false; 
     } 
    }; 
} 

OnResume

@Override 
protected void onResume() { 
    super.onResume(); 

    //Bind to NetworkService 
    if(!boundToService) 
    { 
     Intent intent = new Intent(this, NetworkService.class); 
     bindService(intent, networkServiceConnection, Context.BIND_AUTO_CREATE); 
    } 
} 

OnPause

@Override 
protected void onPause() { 
    super.onPause(); 

    unregisterReceiver(networkServiceMessageReceiver); 
} 

OnStop

@Override 
protected void onStop() { 
    super.onStop(); 

    unbindService(networkServiceConnection); 
} 
+0

сделать регистрацию/отмену регистрации парами: создать/уничтожить или запустить/остановить или возобновить/приостановить – pskink

+0

Итак, если я зарегистрирую i в onCreate, я должен отменить регистрацию в onDestroy? – Sulby

+0

да, но его лучше сузить жизненный цикл, чтобы начать/остановить или даже возобновить/приостановить – pskink

ответ

1

Вы вызываете unregisterReceiver() в контексте Activity, но вы вызываете registerReceiver() в контексте LocalBroadcastManager. Это не сработает. Вам необходимо зарегистрироваться и отменить регистрацию на том же Context.

Удостоверьтесь, что вы только отменили регистрацию, если ваш Service уже был связан, иначе вы не будете звонить register().

Кроме того, поскольку вы являетесь незарегистрированным в onPause(), вам необходимо пройти регистрацию в onResume().

0

У меня возникают ошибки, где я зарегистрировать приемник широковещательной передачи в конструктор. Однако, когда я отменяю его регистрацию в onPause, он исключает исключение из-за отсутствия регистрации.

Вы регистрируете свою широковещательную рассылку внутри служебного соединения, которое зависит от результата подключения. Результат подключения onServiceConnected занимает некоторое время после службы привязки. В то же время, если вызвано , это исключает возможность регистрации.

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

Смежные вопросы