Это движок мессенжера, построенный с использованием open-source библиотек. Движок польностью модульный. Каждый модуль представляет отдельный open-source проект на Github, с описанинием и запускаемым демонстрационным приложением.
Демонстрационное приложение можете загрузить из GooglePlay
Мгновенная отзывчивость - это способность UI элементов на клиентском устройстве, мгновенно реагировать на изменения источников контента, расположенных на других клиентских устройствах, без необходимости запросов к серверу, и действий со стороны пользователя
Например, изменение фотографии профиля пользователя, отображается на устройствах всех пользователей мгновенно. Без необходимости перезагрузки фрагмента или активити. Изменение происходит во всех фрагментах, даже косвенно отображающих фотографию этого пользователя.
Другой пример. При получении нового сообщения, транспорт() записывает его в Sqlite БД. При записывании данных вызываетя ContentResolver, который через переданный ему URI вызывает onContentChanged
в курсоре, который используется на UI фрагменте. В итоге, вызывается onLoadFinished(Loader<Cursor> loader, Cursor data)
на нужном фрагменте. Таким образом UI-фрагменты мгновенно реагируют на изменения сервера.
Способ описанный выше отличается простой реализацией, надежностью. Не требует Intent
и BraocastMessage
чтобы ловить изменение состояния системы. Методика применения MultipleTypesAdapter дополняет этото способ, и существенно упрощает разработку.
Здесь и далее, применяется единая архитектура описанная выше. Прежде чем перейти к изучению кода, автор рекомендует ознакомиться с MultipleTypesAdapter и Communicator
Чат с одним человеком. При изменении состояния Sqlite БД, вызывается onLoadFinished(Loader<Cursor> loader, Cursor data)
. Он формирует новый MatrixCursor
для адаптера. Адаптер "кушает" особым образом построееный курсор, который автор для простоты называет MatixCursor
Обратите внимание на LOADER_USERS
, благодоря которым получается "мгновенная отзывчивость", на изменение профиля другого пользователя, без необходимости перезагрузить весь фрагмент. Перезагружается только нужный Loader.
Групповой чат, принцип работы одинаковый с чатом с одним человеком
Это базовый класс для фрагментов ConversationPrivate.java
и ConversationGroup.java
отображающих непосредственно чат. Основную работу по отображению записей полученных из БД, делает именно этот класс
Архитектура точно такая-же. Отличие данного UI фрагмента, в более сложном SQL-запросе, который расположен в ContentProvider
. Т.е. на данном архитектурном уровне нет отличия от фрагментов описанных выше. Все тот же "мулти-адаптер" и "отзывчивость"
Архитектура точно такая как предыдущие. Отличие данного UI фрагмента, в более сложном SQL-запросе, который расположен в ContentProvider
. Т.е. на данном архитектурном уровне нет отличия от фрагментов описанных выше. Все тот же "мулти-адаптер" и "отзывчивость"
ВНИМАНИЕ! Данная библиотека - это реализация только клиентской части. Серверную часть вы можете видеть в репозитории автора на GitHub. Есть инструкция по самостоятельному запуску и настройке сервера
Проект содержит много git-подмодулей, которые при неумелом использовании могут принести неприятности. Поэтому делайте как я, тогда с git-подмодулями проблем не будет
- Для клонирования репозитория, автор рекомендует использовать командную строку, вместо EGit Eclipse или AndroidStudio. Т.к. проект содержит настройки workspace в папке репозитория, и репозитории подмодулей находятся НЕ в ветке master, и подмодули тоже имеют свои подмодули. В командной строке выполните:
$ git clone git://github.com/Igorpi25/Chat.git Chat
$ cd Chat
$ git submodule update --remote --recursive --init
```
Параметры третьей строки (git submodule update --remote --recursive --init
) означают:
* `--remote` - подмодуль нужно скачать из ветки удаленного репозитория. Название ветки записано из файле ".submodule" в параметре `branch`. Это ветка `library`, в ветке `master` находится запускаемый демо-проект
* `--recursive` - повторяй команду `git submodule update --remote --recursive --init` для всех модулей, и их вложенных подмодулей
* `--init` - если подмодуль не инициализирован, то инициализируй. (во вложенных подмодулях это очень кстати, без этого нам бы пришлось вызывать `git submodule init` для каждого вложенного подмодуля)
- ActionBarSherlock
- Volley
- Glid - используется в демо-проекте
- Connection- Диалоги ошибки соединения к интернету. Включен в составе Session
- Session - Авторизация пользователя на сервере
- Uploader - Отправка фотографий на сервер
- Communicator - это архитектурно важная библиотека. Все дела с Websocket, парсинг json и т.п.
- MultipleTypesAdapter - вся архитектура UI-элементов построена на этой библиотеке
- Profile - профили пользователся и группы. Модуль обеспечивает элементы "социальной сети"
See the LICENSE file for license rights and limitations (Apache).