2014-09-10 3 views
2

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

Фоновая служба часто проверяет время и хранит большой массив объектов (до 300), проанализированных из XML-файла.

Каждый объект представляет собой событие с соответствующим STARTTIME и когда соответствует начального времени текущего времени служба должна уведомить деятельности (если таковой имеется), чтобы отобразить, что событие происходит.

На стороне действия у меня есть фрагменты (вкладки пейджера раздела) с помощью специального массива-адаптера, чтобы перечислять события в ListView.

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

Поскольку каждый фрагмент должен содержать arrayList для обновления ArrayAdapter, а затем ListView, я получаю тот же объект, который хранится как внутри массива службы, так и в одном из массива фрагмента. Мне интересно, есть ли лучший способ.

Вопрос: что было бы самым эффективным (по использованию памяти/скорости процессора и скорости) способом совместного использования большого массива объектов между моей службой и моей деятельностью?

+0

пользовательский обработчик syncronus для этого –

+0

Проверьте эту ссылку http://stackoverflow.com/questions/13519140/android-singleton-which-is-used-between-activity-and-service. В нем немного обсуждается автобус и сингл. –

ответ

1

Вы можете использовать greenrobot's EventBus. Я не думаю, что вы можете избежать дублирования данных. Если вы будете использовать один и тот же экземпляр объекта в Сервисе и в Фрагментах, вам нужно будет каждый раз сообщать об адаптерах, иначе вы получите ошибки.

Вам будет лучше хранить загруженные объекты в локальной базе данных SQLite и загружать только минимальный объем информации, необходимой во Фрагментах. Это позволит свести к минимуму время, необходимое для передачи данных из потока IntentService в основной поток активности (поскольку вы даже не переносите данные, просто отправьте сигнал текущему фрагменту, что данные были обновлены). A ContentObservable также может помочь вам.

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

+0

благодарю вас за эту информацию, я посмотрю на greenrobot. О базе данных SQLite, не повлияет ли это на производительность? – Misakira

+1

Пока вы вставляете данные в фоновый поток и используете эффективные вставки SQL, все должно быть хорошо. –

Смежные вопросы