2015-02-02 3 views
-1

Я столкнулся с проблемой при попытке сделать приложение для Android. Я создал Сервис, который будет использоваться моей основной деятельностью. Следуя инструкциям, которые я нашел в Интернете, я делаю привязку к функции onStart.Android - приложение падает, если я пытаюсь использовать его методы после привязки

@Override 
public void onStart() { 
    super.onStart(); 
    //TextView textView = (TextView) findViewById(R.id.myText); 
    textView.setText("Bound??????"); 
    if (mBound == false) { 
     Intent intent = new Intent(this, com.mycompany.Messenger.LocalService.class); 
     mBound = bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 
     //mBound = bindService(intent, mConnection, 0); 
     //startService(intent); 
     if (mBound == true) 
     { 
      TextView textView = (TextView) findViewById(R.id.myText); 
      textView.setText("Bound"); 
     } 
     if (mBound == false) 
     { 
      TextView textView = (TextView) findViewById(R.id.myText); 
      textView.setText("UnBound"); 
     } 
     boolean connected = mService.CreateConnectionNetwork(); 


    } 
} 

После точки, в которой я воздаю связывание, еще внутри onStart функции, я пытаюсь вызвать метод связывания службы, который chekcs если есть подключение к Интернету. Однако в этот момент приложение выйдет из строя. Как вы заметили, я добавил проверку того, была ли привязка успешной или нет, что выходит успешно, что еще более запутывает вопрос.

Я дал приложению правильные разрешения, и методы службы действительно работают, если я инициирую их через событие, например. нажатие кнопки. Тем не менее, есть задачи, которые я хочу выполнить автоматически, когда приложение запускается, а не после взаимодействия с пользователем. Какие-либо предложения?

+0

В чем исключение? – barq

+0

Я только что создал свой вопрос в вопросе, что, если бы я увидел, я сразу понял бы, почему мое приложение разбилось - мне потребовалось несколько часов, чтобы найти комментарий, подразумевающий ответ в каком-то случайном вопросе stackoverflow. Я просто не мог понять, почему функции службы не будут работать после привязки - даже простейший вызов без какого-либо присвоения значений в Activity, и никто не говорил об асинхронном поведении привязки сервиса. –

+0

Если вы считаете, что вопрос плох, все в порядке, но если прошлое меня наступило после этого QA во время поиска, это спасло бы меня. Я новичок в Android, и этот QA также подходит для других новичков, которые могут столкнуться с одной и той же проблемой. –

ответ

-1

Проблема возникает из-за непонимания того, как работают службы. Когда вы выполняете привязку внутри функции onStart, вы просто отправляете «Intent» (как сигнал) в систему для выполнения привязки к сервису. Однако теоретически у вас нет никаких гарантий того, когда привязка будет завершена. И на практике вы можете быть уверены, что привязка будет завершена только после того, как функции onStart завершат свою работу, поэтому причина, по которой услуга может быть использована с помощью кнопки, например.

Если это первый раз, когда служба привязана, и вы хотите выполнить некоторые действия автоматически, когда вы уверены, что служба связана, лучшее место для этого - внутри функции onServiceConnected. Когда вызываемая функция вызывается, вы можете быть уверены, что привязка инициирована, поэтому после фрагмента кода, где привязка завершена (после кода mService = binder.getService(); в коде ниже) вы можете добавить код, который хотите выполнить.

@Override 
    public void onServiceConnected(ComponentName mConnection, IBinder service) { 

     LocalService.LocalBinder binder = (LocalService.LocalBinder) service; 
     mService = binder.getService(); 
     mService.CreateConnectionNetwork(); 
     textView.setText("I just used the service and it did not crashhh!!!"); 

    } 
+0

Реальная проблема заключается в том, что вы на самом деле пытались обновить пользовательский интерфейс из «Сервиса». Служба будет уведомлять пользовательский интерфейс («Деятельность») о любых изменениях, которые он должен выполнить, то есть через широковещательную или локальную трансляцию. – 323go

+0

Вы имеете в виду, что просто вызов функции приведет к обновлению пользовательского интерфейса? Без присвоения значения. –

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

  • Нет связанных вопросов^_^