Не запускается Thread из BroadcastReceiver

Ответить
WBR
Сообщения: 1
Зарегистрирован: 20 июн 2013, 12:34

Не запускается Thread из BroadcastReceiver

Сообщение WBR » 20 июн 2013, 13:23

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

Заранее благодарю за любой комментарий.

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Не запускается Thread из BroadcastReceiver

Сообщение neoksi » 20 июн 2013, 13:57

Продолжительные операции в BroadcastReceiver делать нельзя, он должен работать не более 10 секунд, а далее может быть прибит системой. Такие операции нужно выносить в сервис.

Ответить