#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. Спасибо Вайнет Шукла. Итак, я создаю обработчик с таймером, и, например, каждые 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. Извините, это слишком старое. Ничего не могу вспомнить об этом.