UPD Пока писал это сообщение, программа одумалась и нить начала запускаться Правда, она запускается не при первом вызове MyPing, а при последующем.
Прошу прощения за отнятое время. В любом случае, спасибо.
==========
Всем доброе время суток.
Недавно решил освоить программирование под Android и поэтому, возможно, мой вопрос будет звучать глупо. Прошу больно канделябрами не бить, а направить на путь истинный
Для начала предыстория. Может это не имеет прямого отношения к проблеме, но может я уже ранее в чем-то ошибся.
В своем приложении я пытаюсь запустить следующий механизм - периодически в фоновом режиме должен опрашиваться некий сервер и в некоторых случаях должно возникать уведомление для пользователя о том, что произошло какое-то событие. По сути, что-то по внешним проявлениям аналогичное почтовому приложению, которое уведомляет, что пришло новое письмо.
У меня есть MainActivity, MyService и MyBroadcastReceiver.
MyBroadcastReceiver в onReceive получает BOOT_COMPLETED и запускает сервис, манифест дополнил. При этом, из MainActivity тоже запускается сервис по нажатию кнопки (правильно ли я понимаю, что для того, чтобы сервис запускался при включении устройства, его однажды нужно запустить из Activity?)
Дальше есть сомнения, насколько правильно сделано, но в результате скрещивания разных примеров из сети получилось такое.
1) В MyService
...
MyBroadcastReceiver alarm = new MyBroadcastReceiver()
public int onStartCommand(Intent intent, int flags, int startId) {
alarm.SetAlarm(this);
return super.onStartCommand(intent, flags, startId);
}
...
2) В MyBroadcastReceiver
....
public void SetAlarm(Context context)
{
AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, PeriodicalAlarm.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 1, pi); // Millisec * Second * Minute
}
@Override
public void onReceive(Context context, Intent intent)
{
if("android.intent.action.BOOT_COMPLETED".equals(intent.getAction()))
{
Intent serviceLauncher = new Intent(context, MyService.class);
context.startService(serviceLauncher);
}
MyPing ();
}
void MyPing () {
new Thread(new Runnable() {
public void run() {
//работа с сетью
}
}).start();
}
...
Так вроде бы все работает, пока не доходит до MyPing, где возникает следующая проблема - программа доходит до
new Thread(new Runnable()
и дальше ее просто обходит и выходит из процедуры, работа с сетью не происходит.
Если убрать запуск новой нити и просто начать работать с сетью, программа выбивает ошибку о том, что нельзя, мол, работать с сетью из главной нити.
Когда такой же MyPing вызывается из MainActivity, то все получается и работа с сетью происходит.
Два вопроса:
1. Почему не запускается в такой конструкции новая нить и как сделать, чтобы она запускалась (либо как иначе добраться до сети)?
2. Если вообще конструкция неправильная и отсюда эта проблема, то какая конструкция должна быть? Ведь, насколько я понимаю, задача для мобильных приложений тривиальная, но внятного примера или описания подобной задачи я в сети не нашел, приходится изобретать велосипед.
Заранее благодарю за любой комментарий.
Не запускается Thread из BroadcastReceiver
Re: Не запускается Thread из BroadcastReceiver
Продолжительные операции в BroadcastReceiver делать нельзя, он должен работать не более 10 секунд, а далее может быть прибит системой. Такие операции нужно выносить в сервис.