#android #android-service #android-service-binding
#Android #android-сервис #android-service-привязка
Вопрос:
У меня вопрос из двух частей. Оба являются несколько общими.
- Я создаю приложение, которое в значительной степени зависит от связи с сервером. Я планирую иметь разные классы для каждого репозитория, который мне понадобится. Является ли служба Android правильным шаблоном для использования здесь? Могут быть определенные ситуации, когда я захочу кэшировать вещи между действиями. Позволит ли мне служба это сделать?
- Предполагая, что я хочу использовать для этого службу, как я могу загрузить содержимое после привязки службы. Когда пользователь открывает приложение, я хочу начать загрузку контента. Однако привязка службы не блокируется, поэтому я не могу написать код, который выполняет запросы с помощью службы в моем
onStart()
праве? Есть ли какой-нибудь вспомогательный класс, который будет ждать загрузки службы, а затем выполнять функцию? Я знаю, что мог бы добавить некоторый код в свойonServiceConnected()
метод, но я бы хотел держаться подальше от такого соединения.
Надеюсь, это было не слишком абстрактно. Заранее спасибо.
Ответ №1:
Да, сервис — это путь, но started
сервис, а не bound
один.
Вы можете создавать методы асинхронного запроса, и служба может транслировать результат обратно в вашу активность.
- Асинхронный запрос в этом случае представляет собой a
startService(intent)
с намерением, содержащим параметры запроса. Служба запустит фоновый поток для выполнения операции, оптимально вы можете использовать для этого сетевую библиотеку (например, Volley). - И ответ является трансляцией службой с соответствующими данными.
Это решает проблему кэширования, потому Service
что может решить, что возвращать. Поэтому, если у службы нет запрошенного ресурса, он загрузит (и вернет) его. Но если у службы есть ресурс, он просто вернет кэшированную версию.
Для начала вам следует ознакомиться со следующими темами:
- Запущенные службы (для запросов)
- LocalBroadcastReceiver (для ответа)
- Шина событий (альтернатива LocalBroadcastReceiver, например Otto)
Я мало что знаю о ваших конкретных потребностях, но, похоже, вы хотите реализовать клиент REST с кешем. Здесь есть действительно хорошая презентация Google IO. Определенно стоит посмотреть!
Ответ №2:
1) Если вам нужен код для запуска, даже если ваша активность отсутствует, правильный ответ — сервис. Если вам просто нужно кэшировать данные, то их хранение в глобальной статической переменной где-нибудь может быть в порядке.
2) Ваша служба может запускать поток или AsyncTask. Они выполняются параллельно. В этом случае обычно запускается onStartCommand .
Ответ №3:
Как и в большинстве случаев, ответы на эти вопросы в лучшем случае субъективны. Мне понадобится больше информации, чем у меня есть в настоящее время, но я сделаю неопределенный общий обзор…
-
Если вам нужно, чтобы что-то постоянно попадало на ваш сервер, я бы сказал, используйте сервис.
-
То, где вы его вызываете, не так важно, как то, сколько раз его нужно вызывать. При этом ответ положительный. Если вам нужны эти данные, как только приложение или действие загружается, то
onCreate
метод, где он должен быть загружен.
Моя рекомендация — это либо A) service, либо B) AsyncTask.
Используйте A, если вам нужно повторно обращаться к серверу за данными и получать их через регулярные промежутки времени. В противном случае выполните AsyncTask и загрузите все необходимые данные в объект для хранения. Затем вы можете использовать его по мере необходимости, и он, по сути, будет «кэшироваться».
Разница между ними просто «лучший инструмент для работы». Я вижу, вы используете какой-то javascript. Чтобы привести правильную аналогию, использование службы для вызова сервера, а не асинхронной задачи, эквивалентно использованию веб-сокета (node js), когда вы могли бы просто использовать вызов ajax. Надеюсь, это поможет. О, и PS, пожалуйста, не используйте статические переменные в Android =).