Синхронизация между локальной службой с потоком и деятельностью - PullRequest
4 голосов
/ 01 июня 2010

Я пытаюсь найти способ синхронизации между локальной службой и основным видом деятельности.

Местная служба имеет,

  • Поток с сокетным соединением, который может принимать данные в любое время.
  • Список / массив с данными.
  • В любое время сокет может получать данные и добавлять их в список.

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

Я думаю, что мне нужно каким-то образом синхронизировать мой список, чтобы локальная служба не добавляла в него новую запись, пока действие извлекает список при подключении к службе.

Есть идеи?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 01 июня 2010

Я ответил на несколько похожий вопрос здесь . В этом ответе есть ссылка на презентацию, которую проводит Марк Брэйди на droidconf в Берлине. В своих слайдах он описывает структуру, которая управляет такими вещами. Он также предлагает источник для этого на github .

Он предлагает следующее решение. Создайте объект контроллера, который находится в области пользовательского класса приложения. Контроллер запускает службу или простой рабочий поток и уведомляет пользовательский интерфейс, если служба получает уведомление о том, что что-то изменилось. Он советует не использовать AIDL, если это не является абсолютно необходимым.

Документация по Android также предлагает пример о том, как запустить локальный процесс.

3 голосов
/ 01 июня 2010

Существует множество способов установить связь между активностью и службой и обмениваться данными между ними. Вы можете общаться, используя следующие решения:

  • Намерения. Вы можете отправлять ( sendBroadcast (намерение)) и получать ( BroadcastReceiver ) Intents. Пример сценария: Ваша активность в момент загрузки отправляет широковещательную рассылку "GIVE_ME_ALL_DATA", а служба отправляет ответ Если у службы есть новые данные, она также передает "HEY_I_HAVE_NEW_DATA".
  • ContentProvider. Служба и деятельность читают и пишут параллельно с ней. Вы можете прикрепить наблюдателя к определенному URL-адресу данных, чтобы каждый слушатель был проинформирован об изменениях. Если вы используете CursorAdapter для привязки данных к компонентам пользовательского интерфейса, пользовательский интерфейс будет обновляться автоматически.
  • AIDL . Это android'a IPC. Вы определяете интерфейс для сервиса, который будет выставлен клиентам. Клиент в начале: устанавливает соединение с сервисом, запрашивает данные, регистрирует обратные вызовы. Если служба имеет новые данные, она вызывает обратные вызовы, зарегистрированные клиентами.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...