Нормально ли вызывать одну службу из разных действий через AsyncTask?

#android #android-service #android-asynctask

#Android #android-сервис #android-asynctask

Вопрос:

У меня каждую секунду происходит Service загрузка данных с веб-сервера (это Service запускается с моего основного Activity ). В моем приложении есть другие Activity приложения, каждому из которых необходимо обновить свой пользовательский интерфейс в соответствии с данными, загруженными Service .

Моя идея состоит в том, чтобы предоставить каждому из моих Activity ов AsyncTask , который будет извлекать небольшое количество данных из Service каждой секунды. Затем AsyncTask сообщит пользовательскому интерфейсу об обновлении.

До вчерашнего дня я все делал через AsyncTask , но сегодня утром я прочитал в stackoverflow, что извлечение данных и передача их нескольким Activity пользователям — это скорее Service работа, чем AsyncTask один.

Итак, я придумал это (не очень хорошее, даже немного дрянное) решение, потому что я не могу найти, как уведомлять мои Activity серверы, когда данные извлекаются Service . Я читал о широковещательном приемнике, слушателе, намерении… но не могу понять, как я могу заставить мой Activity периодически «подписываться» на эту службу.

Спасибо за вашу помощь.

PS: разве смешно вот так кодировать каждое из моих ключевых слов в моем письме :)?

PS2: вариант использования моего приложения — получение температуры, давления и т.д. Из веб-служб и мониторинг каждой из этих величин в разных действиях (я не могу отслеживать их все в одном действии).

Комментарии:

1. Прокомментируйте свой первый «PS»: Да, кажется немного агрессивным, imo 🙂

2. Хорошо, я буду иметь это в виду для будущего вопроса.

Ответ №1:

Данные могут обновляться по активности из службы через обработчик.

  1. В службе вы можете создать средство получения и настройки обработчика.
  2. Установите обработчик действия, когда начнется ваше действие, что позволит службе иметь обработчик действия, которое в данный момент видно.
  3. Используйте этот экземпляр обработчика для уведомления о данных для действия.

Перейдите по этой ссылке для получения обработчика.

Комментарии:

1. Спасибо Вайнет Шукла. Итак, я создаю обработчик с таймером, и, например, каждые 1000 мс он будет вызывать средство получения в службе? Я правильно понимаю? Если да, то в чем разница с AsyncTask, о которой я говорил … помимо очевидного :).

2. Почему вы используете таймер обратного отсчета? Когда вы перейдете к действию, установите его обработчик для службы, чтобы у вашей службы был обработчик текущего видимого действия.

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

4. вы отправите mag из обработчика, когда у вас будут некоторые данные для действия, и вы получите это сообщение вместо действия. Получив сообщение об ошибке, вы можете обновить свою активность.

5. Я публикую решение, которое, я думаю, вы мне описали, и последнее, что мой обработчик должен был быть статическим для вызова из службы… обойти никак?

Ответ №2:

Итак, вот как я добиваюсь того, чего хочу (благодаря Вайнет Шукла) :

В операции «ServiceConsumerActivity» добавьте :

 public static RefreshHandler mRefreshHandler;

class RefreshHandler extends Handler
{  
    @Override  
    public void handleMessage(Message msg)
    {  
        showServiceData(); //from which I call a method of the Service for getting the fetching value 
    }  
};
  

В службе добавьте :

 Message mMessage = new Message();
ServiceConsumerActivity.mRefreshHandler.sendMessage(mMessage);
  

Комментарии:

1. не могли бы вы, пожалуйста, также записать функцию showServiceData. Спасибо

2. Извините, это слишком старое. Ничего не могу вспомнить об этом.