Сервис с AsyncTask - PullRequest
       23

Сервис с AsyncTask

3 голосов
/ 28 сентября 2011

Я слышал, что нехорошо иметь асинхронную задачу в службе.

Это действительно необходимо для AsyncTask или просто onStartCommand()?

Мне интересно, потому что у меня есть Service с AsyncTask, который запускается по тревоге. И он запускает Service более одного раза; запуск только один раз.

Может ли это быть причиной?

EDIT:

Вот как я настроил будильник.

    String alarm = Context.ALARM_SERVICE;

    AlarmManager am = (AlarmManager)getSystemService(alarm);

    Intent Aintent = new Intent("REFRESH_THIS");
    PendingIntent pi = PendingIntent.getBroadcast(this, 0, Aintent, 0);
    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.HOUR_OF_DAY, 9);
    calendar.add(Calendar.MINUTE, 0);
    calendar.add(Calendar.SECOND, 0);
    calendar.add(Calendar.MILLISECOND, 0);

    am.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis() , AlarmManager.INTERVAL_DAY, pi);

Ответы [ 3 ]

5 голосов
/ 28 сентября 2011

Нет ничего плохого, если вы хотите использовать AsyncTask в обслуживании.Хорошо, если вы используете asynctask в сервисе, потому что сервис работает в основном потоке , так что если вы используете длинный процесс из сервиса, это может замедлить ваш пользовательский интерфейс.

Вы также можете создать поток иработа в этом.

3 голосов
/ 28 сентября 2011

Если у вас есть длительная операция в службе, рассмотрите возможность использования IntentService , она запустит и будет управлять фоновым потоком для вас. И он имеет дополнительное преимущество, заключающееся в том, что автоматически отключается. Вы можете добиться чего-то подобного с AsyncTask, но IntentService сделает правильную вещь.

Что касается вашего другого вопроса, то служба, запускаемая несколько раз, не имеет ничего общего с AsyncTask. Если ваш будильник срабатывает несколько раз, он запустит несколько экземпляров вашего сервиса. AFAIK, на самом деле, нет никакого способа сделать одноэтапный сервис автоматически. Вы можете проверить, запущен ли он перед запуском, или установить флаг настроек (подвержен ошибкам), но предпочтительным способом является запуск кратковременных сервисов каждый раз, когда вам нужно что-то сделать, и закрытие самих себя после завершения. IntentService прекрасно подходит под эту модель.

1 голос
/ 03 июля 2012

Существует способ получить больший контроль над потоками и задачами, особенно если вам нужно выполнять разные в определенном порядке. Существует хороший подход к управлению всей системой с использованием очередей, исполнителей пула потоков, runnables / callables и службы. http://ugiagonzalez.com/2012/07/02/theres-life-after-asynctasks-in-android/

...